0

invokeAll() の呼び出し後に完了したタスクの数を見つける方法はありますか? すべてのスレッドが完了すると、完了したタスクのブール値のリストが返されるようです。

1000 個のタスクのプールがあり、それらを 100 個のタスクのバッチに分割することなく、100 個の間隔でそれらを調べたいと考えています。

また、互換性の理由から Java 6 を使用する必要があるため、新しい方法は役に立ちません。

また、副次的な質問として、invokeAll() は FIFO 方式でタスクを処理しますか? つまり、タスクはタスク リストに追加された順序で開始されますか?

ありがとう

4

2 に答える 2

3

1000 個のタスクのプールがあり、それらを 100 個のタスクのバッチに分割することなく、100 個の間隔でそれらを調べたいと考えています。

を使用してすべてのジョブが完了するExecutorCompletionServiceのを待つのではなく、1 つのジョブが完了したら通知を受け取ることができる を使用することを検討する必要があります。次に、完成した各ジョブをコレクションに入れ、100 個になったらアクションを実行します。invokeAll()

たぶん次のようなもの:

CompletionService<Result> ecs = new ExecutorCompletionService<Result>(executor);
for (Callable<Result> s : solvers)
    ecs.submit(s);
int n = solvers.size();
List<Result> batch = new ArrayList<Result>();
for (int i = 0; i < n; ++i) {
    Result r = ecs.take().get();
    batch.add(r);
    if (batch.size() >= 100) {
       process(batch);
       batch.clear();
    }
}
if (!batch.isEmpty()) {
    process(batch);
}

invokeAll() は FIFO 方式でタスクを処理しますか? つまり、タスクはタスク リストに追加された順序で開始されますか?

タスクは、FIFO 方式でスレッド プールに送信され、FIFO 順序でスレッドによってデキューされます。ただし、各スレッドがジョブを取得すると、競合状態が発生し、実際のタスクの「開始」と確実に終了する順序が変更される可能性があります。

于 2013-04-24T19:47:18.183 に答える