3

我必须将两个字符串传递给一个线程,该线程将返回一个包含它们的数组,并且我必须使用可调用的。

这是我到目前为止所拥有的:

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[] 但它正在获取一个对象。如果我转换结果,它会说必须声明一个异常被抛出。

4

3 回答 3

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;
        }
    }
}
于 2012-08-28T20:22:07.360 回答
2

Callable<V>中,参数化类型V代表 的结果类型call()。由于您想返回 a String[],而不是Callable<String>,请使用Callable<String[]>. 然后,将返回类型更改callString[]

@Override
public String[] call() throws Exception {
    String [] allStrings = new String[2];
    allStrings[0] = string1;
    allStrings[1] = string2;
    return allStrings;
}

作为旁注,Java 中的类名应该是名词,并且应该以大写字母开头。

于 2012-08-28T20:21:18.780 回答
1

您没有在 中引用您的ToArrayTheFunction,可能是由于编译错误(提示:已经提到了修复)。

您的新 FutureTask 将如下所示:

FutureTask<String[]> task = new FutureTask(new ToArray("foo", "bar"));

如果不告诉您简单的答案,您将在call()方法中遇到 2 个异常ToArray

  • 首先,您的 String 数组从未初始化,但应该初始化。
  • 所有数组都从零开始
于 2012-08-28T20:52:28.860 回答