8

我正在尝试从 call() 返回一个二维数组,但遇到了一些问题。到目前为止,我的代码是:

//this is the end of main   
Thread t1 = new Thread(new ArrayMultiplication(Array1, Array2, length));
t1.start(); 
}

    public int[][] call(int[][] answer)
    {       

    int[][] answer = new int[length][length]; 

    answer = multiplyArray(Array1, Array2, length); //off to another function which returns the answer to here  

    return answer;                                  
    }

此代码编译,这不返回我的数组。我确定我可能使用了错误的语法,但我找不到任何好的例子。

编辑:改变了一点

4

3 回答 3

10

下面是一些演示 Callable<> 接口使用的代码:

public class test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
    Callable callable = new Callable() {
        @Override
        public int[][] call() throws Exception {
            int[][] array = new int[5][];
            for (int i = 0; i < array.length; i++) {
                array[i] = new int[]{5 * i, 5 * i + 1, 5 * i + 2, 5 * i + 3};
            }

            return array;
        }
    };

    ExecutorService service = Executors.newFixedThreadPool(2);
    Future<int[][]> result = service.submit(callable);

    int[][] intArray = result.get();
    for (int i = 0; i < intArray.length; i++) {
        System.out.println(Arrays.toString(intArray[i]));
    }
}
}

这样做是构造一个可以提交给执行器服务的对象。它与 Runnable 基本相同,只是它可以返回一个值;我们在这里所做的是创建一个具有两个线程的 ExecutorService,然后将此可调用对象提交给服务。

接下来发生的是 result.get(),它将阻塞直到可调用对象返回。

您可能不应该自己进行线程管理。

于 2011-04-01T16:57:46.310 回答
6

添加到 Joseph Ottinger 的答案中,要传递要在 Callable 的 call() 方法中使用的值,您可以使用闭包:

    public static Callable<Integer[][]> getMultiplierCallable(final int[][] xs,
            final int[][] ys, final int length) {
        return new Callable<Integer[][]>() {
            public Integer[][] call() throws Exception {
                Integer[][] answer = new Integer[length][length];
                answer = multiplyArray(xs, ys, length);
                return answer;
            }
        };
    }

    public static void main(final String[] args) throws ExecutionException,
            InterruptedException {
        final int[][] xs = {{1, 2}, {3, 4}};
        final int[][] ys = {{1, 2}, {3, 4}};
        final Callable<Integer[][]> callable = getMultiplierCallable(xs, ys, 2);
        final ExecutorService service = Executors.newFixedThreadPool(2);
        final Future<Integer[][]> result = service.submit(callable);
        final Integer[][] intArray = result.get();
        for (final Integer[] element : intArray) {
            System.out.println(Arrays.toString(element));
        }
    }
于 2011-04-01T17:48:34.577 回答
2

除了 Joseph 的出色回答外,请注意您的方法签名是int[][] call(int[][]). 如果您引用Callablejavadoc,您将看到Callable'call()方法不接受任何参数。所以你的方法是一个重载,而不是一个覆盖,所以不会被任何调用Callable'scall()方法的东西调用。

于 2011-04-01T17:01:18.397 回答