1

java.util.concurrentパッケージ初心者です。私はいくつかのサンプルを書き込もうとしています。これが私のサンプルコードスニペットです:

for (MyTask task : tasks) { 
Future<Boolean> result = task.getResult();
try {
    if (result.isCancelled()) {
        logger.info("processResults():  cancelled: "+ ((MyTask) task).getName());
    } else if (result.get() == false) {
        logger.info("processResults(): Failed : "+ ((MyTask) task).getName());
    } else {
        logger.info("processResults(): successful: "+ ((MyTask) task).getName());
        tasks.remove(task);
        continue; 
    }
} catch (Exception e) {
    logger.warn("processResults(): Excepiton: " + e.getMessage());
} 
}

ワーカー スレッドからの Future オブジェクトの処理に関して 1 つ質問があります。私のforループでは、タスクの処理は順次行われます。たとえば、ワーカー スレッドから返された結果を処理する必要があるとします。2 番目のワーカー スレッドが最初のワーカー スレッドより前に完了した場合、私のコードでは 2 番目のワーカー スレッドを最初に処理する方法がありません。

現在のスレッドを処理するための最良の方法を提案できる人はいますか?

ありがとう、ベンカット・パパナ

4

4 に答える 4

3

これは、生産者/消費者パターンを使用する典型的なケースです。タスク(プロデューサー)に結果をキューに入れ、「次のステップ」コード(コンシューマー)にキューから結果を取得させて作業を続行させます。

ArrayBlockingQueueが良い選択でしょう。ワーカースレッドの2番目のセットは、take()何かが利用可能になるまで(最初のステップのスレッドがput()キューを呼び出すとき)、キューブロックを呼び出します。

于 2011-08-27T09:56:25.917 に答える
1

問題は、 java.util.concurrent.CompletionService用に調整されたように聞こえます。

CompletionService の目的は、タスクの生成をそれらのタスクの結果の消費から切り離すことです。

結果コンシューマーは、タスク プロデューサーと同じスレッドに存在できますが、そうである必要はありません。

于 2011-09-29T12:08:12.723 に答える
0

タスクが終了したらすぐに何らかの作業を実行したい場合は、同じスレッドで実行できます。つまり、すべてを実行するようにタスクを変更し、すべてが完了した後に値を返すようにします。

于 2011-08-27T08:23:02.643 に答える
0

これはJava NIO (ノンブロッキング IO)の仕事のようです。 この記事は Java 1.4 のものですが、それでも NIO のセットアップ方法を十分に理解することができます。それ以来、NIO は大幅に進化しており、Java 6またはJava 7の APIを検索して新機能を確認する必要がある場合があります。

于 2011-08-27T09:19:47.480 に答える