Java 使用callable传递两个参数并返回一个参数数组
我必须将两个字符串传递给一个线程,该线程将返回一个包含这两个字符串的数组,我必须使用callable 以下是我目前掌握的情况:Java 使用callable传递两个参数并返回一个参数数组,java,arrays,callable,Java,Arrays,Callable,我必须将两个字符串传递给一个线程,该线程将返回一个包含这两个字符串的数组,我必须使用callable 以下是我目前掌握的情况: public class toArray implements Callable<String[]> { private String string1 string2; public toArray (String first, String second) { string1= first; string2 = second; }
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;
}
}
公共类toArray实现可调用{
私有字符串string1 string2;
公共toArray(字符串第一,字符串第二)
{
string1=第一;
string2=秒;
}
@凌驾
公共字符串[]call()引发异常{
String[]allStrings=null;
所有字符串[0]=string1;
所有字符串[1]=字符串2;
返回所有字符串;
}
}
主要内容如下:
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();
}
public类基金{
公共静态void main(字符串[]args){
FutureTask task=newFutureTask(newMyCallable());
ExecutorService es=Executors.newSingleThreadExecutor();
提交(任务);
试一试{
String[]result=task.get();
System.out.println(结果[1]+结果[2]);
}
捕获(例外e){
系统错误println(e);
}
es.shutdown();
}
问题出在
main
:它说result需要字符串[],但它得到了一个对象。如果我强制转换result,它会说必须声明抛出异常。在中,参数化类型V
代表的结果类型。因为您希望返回字符串[]
,使用Callable
,而不是Callable
。然后,将call
的返回类型更改为String[]
:
@Override
public String[] call() throws Exception {
String [] allStrings = new String[2];
allStrings[0] = string1;
allStrings[1] = string2;
return allStrings;
}
作为旁注,Java中的类名是名词,应该以大写字母开头。将类的签名更改为
public class toArray implements Callable<String[]>
更新:
好的,有不止一个错误。。。
请参阅以下工作示例
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;
}
}
}
公共类测试{
公共静态void main(字符串[]args){
FutureTask任务=新的FutureTask(新的MyCallable(“a”、“b”));
ExecutorService es=Executors.newSingleThreadExecutor();
提交(任务);
试一试{
String[]result=task.get();
System.out.println(结果[0]+结果[1]);
}
捕获(例外e){
系统错误println(e);
}
es.shutdown();
}
公共静态类MyCallable实现了Callable
{
私有字符串string1、string2;
公共MyCallable(第一个字符串,第二个字符串)
{
string1=第一;
string2=秒;
}
@凌驾
公共字符串[]call()引发异常{
字符串[]所有字符串=新字符串[2];
所有字符串[0]=string1;
所有字符串[1]=字符串2;
返回所有字符串;
}
}
}
您没有在函数
中引用到Array
类,可能是由于编译错误(提示:已提到修复)
您的新未来任务如下所示:
FutureTask<String[]> task = new FutureTask(new ToArray("foo", "bar"));
FutureTask task=newfuturetask(newtoarray(“foo”、“bar”));
如果不告诉您简单的答案,您将在ToArray
中的call()
方法中遇到2个异常:
- 首先,字符串数组从未初始化,但应该初始化
- 所有数组都从零开始
String[]
,但您没有声明将在方法签名中返回String[]
。另一个问题是allStrings
初始化为null
,然后重新使用。您可能想要String[]allStrings=newstring[2]
这并不完全是一个错误(但如果你想听听我的意见,应该是):Java中的类名应该以大写字母开头。所以ToArray
而不是ToArray
。我遇到的问题主要是:它说结果需要一个字符串[]但是它得到了一个对象。如果我强制转换结果,它会说必须声明抛出一个异常“然后,将调用的返回类型更改为String[]:“就像在return allStrings[];?@Ryan:不,返回类型是在public
访问器之后。使用public String调用
,而不是public String调用
调用。这样,您可以将返回类型从String更改为String[]。代码中还有许多其他错误。例如,new MyCallable()是什么?
?它不应该是new toArray(“某个字符串”、“其他字符串”)吗
?另外,使用新建FutureTask
私有字符串string1 string2;也是无效的,要么用逗号分隔两个变量私有字符串string1,string2;
,要么使用两个不同的语句。最后,java中的数组是0索引的
,因此第一个位置是[0],而不是[1]。是否有异常?您是否将allStrings=null
的初始化更改为allStrings=new String[2]
?并将类名toArray
更改为MyCallable
我编辑了:FutureTask task=new FutureTask(new toArray(“foo”,“bar”);非常感谢,但仍然没有更改。
FutureTask<String[]> task = new FutureTask(new ToArray("foo", "bar"));