使用callable传递两个参数并返回一组参数

时间:2012-08-28 20:16:11

标签: java arrays callable

我必须将两个字符串传递给一个线程,该线程将返回一个包含它们的数组,并且我必须使用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 [],但它得到一个对象。如果我转换结果,它会说必须声明一个异常被抛出。

3 个答案:

答案 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个例外:

  • 首先,您的String数组永远不会被初始化,但应该
  • 所有数组从零开始