我必须将两个字符串传递给一个线程,该线程将返回一个包含它们的数组,并且我必须使用callable。
这是我到目前为止所拥有的:
public class toArray implements Callable<String[]> {
private String string1 string2;
public toArray (String first, String second)
{
string1= first;
string2 = second;
}
@Override
public String[] call() throws Exception {
String [] allStrings = null;
allStrings[0] = string1;
allStrings[1] = string2;
return allStrings;
}
}
以下是主要内容:
public class theFuntion{
public static void main(String[] args) {
FutureTask<String[]> task = new FutureTask (new MyCallable());
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit (task);
try{
String[] result = task.get();
System.out.println(result[1] + result[2]);
}
catch(Exception e){
System.err.println(e);
}
es.shutdown();
}
问题出在main
:它说结果是期待一个String [],但它得到一个对象。如果我转换结果,它会说必须声明一个异常被抛出。
答案 0 :(得分:4)
将班级的签名更改为
public class toArray implements Callable<String[]>
以及call
方法的签名
public String[] call() throws Exception
<强>更新强> 好的,有多个错误...... 请参阅以下工作示例
public class Test{
public static void main(String[] args) {
FutureTask<String[]> task = new FutureTask(new MyCallable("a", "b"));
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit (task);
try{
String[] result = task.get();
System.out.println(result[0] + result[1]);
}
catch(Exception e){
System.err.println(e);
}
es.shutdown();
}
public static class MyCallable implements Callable<String[]>
{
private String string1, string2;
public MyCallable (String first, String second)
{
string1= first;
string2 = second;
}
@Override
public String[] call() throws Exception {
String [] allStrings = new String[2];
allStrings[0] = string1;
allStrings[1] = string2;
return allStrings;
}
}
}
答案 1 :(得分:2)
在Callable<V>
中,参数化类型V
代表call()
的结果类型。由于您要返回String[]
而不是Callable<String>
,请使用Callable<String[]>
。然后,将call
的返回类型更改为String[]
:
@Override
public String[] call() throws Exception {
String [] allStrings = new String[2];
allStrings[0] = string1;
allStrings[1] = string2;
return allStrings;
}
作为旁注,Java should中的类名是名词,应该以大写字母开头。
答案 2 :(得分:1)
您尚未在ToArray
中引用TheFunction
类,可能是由于编译错误(提示:已经提到修复)。
您的新FutureTask将如下所示:
FutureTask<String[]> task = new FutureTask(new ToArray("foo", "bar"));
在没有告诉您答案的情况下,您将在call()
中的ToArray
方法中遇到2个例外: