8

call()から2D配列を返そうとしていますが、いくつか問題があります。これまでの私のコードは次のとおりです。

//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と同じです。ここで行っているのは、2つのスレッドで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

ジョセフの優れた答えに加えて、メソッドのシグネチャがであることに注意してくださいint[][] call(int[][])。javadocを参照すると、のメソッドが引数をとらないことCallableがわかります。したがって、メソッドはオーバーライドではなくオーバーロードであるため、のメソッドを呼び出しているものからは呼び出されません。Callablecall()Callablecall()

于 2011-04-01T17:01:18.397 に答える