2

現在、次のことを行うコードがあります。

private final static ExecutorService pool = Executors.newCachedThreadPool();
public void foo(){
    FutureTask<MyObject> first_task = createFutureTask();
    FutureTask<MyObject> second_task = createFutureTask();
    ...

    pool.execute(first_task);
    pool.execute(second_task);
    ....
    first_task.get();
    second_task.get();
    ...
    System.out.println(time taken);
}

私が抱えている問題は、将来のタスクのそれぞれが計算を行うときにかかる時間を出力することです。たとえば、コンソールに表示されます

first_task : 20000ms
second_task : 18000ms
...

ただし、合計時間 ( System.out.println(time taken)) は、将来のタスクにかかる最長時間よりもはるかに長いため、この例に沿って、メソッド do は約 1 分かかります (first_task の 20 秒と比較して)。

これらの将来のタスクは並行して実行されているという印象を受けましたが、タイミングからすると、次から次へと実行されているように見えます。この API を正しく使用していますか?

4

1 に答える 1

2

APIを正しく使用していますが、各タスクは個別のプロセスではなく、個別のスレッドで実行されることに注意してください(したがって、必ずしも並列である必要はありません)。

実際に同時に実行するには、各スレッドを個別のCPUコアで実行する必要があります。これが可能かどうかは、マシン、その現在の負荷、およびJVMとOSがコア間でスレッドをスケジュールする方法によって異なります。

于 2010-03-05T16:22:07.717 に答える