3

私は Executor フレームワークを使用して、スレッドプール、つまり newFixedThreadPool を使用して複数のスレッドを開始しています。threadpool.submit(aThread) を使用して、スレッドプールによって実行されるジョブを送信しますが、これは正常に機能しますが、他の処理を続行できるように、すべてのスレッドがいつ完了するかを判断する必要があります。スレッドが完了するまでブロックする Future.get() の使用を検討しました。ここでの問題は、結果が得られるまでブロックすることです。また、すべてのスレッドが完了しているかどうかを確認するために、シャットダウンを発行した後に isTerminated() メソッドを継続的に呼び出してからスリープ状態にすることも検討しましたが、これはうまくいきません。これに別のよりクリーンな方法はありますか?また、スレッドのいずれかで例外が発生した場合は、実行中の他のすべてのスレッドを終了し、プール内のキューに入れられたスレッドの開始を停止できるようにしたいと考えています。これを行うための最良のメカニズムは何ですか?

返信をお待ちしております

ティア

4

2 に答える 2

7

ExecutorService#shutdown()を使用してからExecutorService#awaitTermination()を使用します

例えば:

ExecutorService service = Executors.newCachedThreadPool();
service.submit(...);
service.submit(...);
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

// All tasks have now finished

タスクが例外で失敗したときに通知する限り。ExecutorService にThreadFactoryを提供して、作成するスレッドごとに「キャッチされていない例外ハンドラー」を設定する必要があります。この例外ハンドラーは、実行中のタスクを終了できます。

于 2009-09-16T18:13:34.580 に答える