0

ThreadPoolExecutors を介して並行タスクを実行します。実行するタスクのセットが 2 ~ 3 あるため、現時点ではThreadPoolExecutorsのマップがあり、一連のタスクをそれらの 1 つに送信できます。

ここで、プールに割り当てられたすべてのタスクがいつ完了したかを知りたいと考えています。その整理方法は、タスクのリストを事前に知っているので、それらを新しく構築されたプールに送信し、プーリング/追跡を開始して、すべてがいつ完了したかを知るように計画します。

1 つの方法として、1 ~ 2 スレッドの別のプールを用意し、他のプールをポーリングしてキューが空になったことを確認します。いくつかのスキャンでそれらが空であると表示された場合 (ポーリングの間に 2 回目のスリープがあり、スキャンが完了したと見なされます)。

別の方法は、クラスをサブクラスThreadPoolExecutor化し、キューを介してトラックを追跡し、リディングを上書きすることafterExecute(Runnable r, Throwable t)です。これにより、各タスクがいつ完了したかを正確に知ることができます。ステータスを表示し、すべてがスムーズに進んでいる場合はすべてが完了したことを知ることができます。

2番目の実装はどこにありますか? リスナーが実装できるインターフェースを用意し、それらをサブクラス化されたメソッドに追加するとよいでしょう。


また、実装を探しています:

  1. タイムアウト内にプールをシャットダウンするように要求するには、

  2. タイムアウトしてもシャットダウンが完了しない場合は、shutdownNow()

  3. これが失敗した場合は、スレッド ファクトリを取得し、そのグループ内のすべてのスレッドを停止します。(ファクトリを設定し、グループまたは他の方法を使用してすべてのスレッドへの参照を取得すると仮定します)

基本的に、プールをクリーンアップして、これをアプリ コンテナーで実行できるようにするための、できる限り確実な方法です。一部のタスクはセレンなどを呼び出すため、スレッドがハングする可能性があります。

最後の溝は、コンテナー (tomcat/jboss) を再起動することですが、それを最後の溝にしたいと考えています。

質問は - これまたは開始するコードのオープン ソース実装を知っていますか?

4

1 に答える 1

1

最初の質問には、ExecutorCompletionService. 完了したすべてのタスクが に追加されるQueueため、ブロッキング キューを使用すると、すべてのタスクがキューに到着するまで待つことができます。

または、 のサブクラスを作成し、FutureTaskそのメソッドをオーバーライドしてdone、「実行後」アクションを定義します。次に、ジョブをラップするこのクラスのインスタンスをエグゼキュータに送信します。

2 番目の質問には簡単な解決策があります。「タイムアウト内にシャットダウンし、タイムアウト後にシャットダウンが完了していない場合は、shutdownNow() を呼び出します」:

executor.shutDown();
if(!executor.awaitTermination(timeout, timeUnit))
  executor.shutdownNow();

スレッドを停止することはすべきではありません (Thread.stop正当な理由により非推奨です)。ただしcancel(true)、仕事で呼び出すことはできます。タスクが中断をサポートしている場合、終了が加速する可能性があります。


ちなみに、すべてのジョブに 1 つを用意してすべてのスレッドのライブ サイクルを管理させるのでThreadPoolExecutorはなく、複数の を用意してそれらをシャットダウンして遊んでいるのは、私には非常に不自然に見えます。はそのために作られています。ThreadPoolExecutorThreadPoolExecutorThreadPoolExecutor

于 2013-09-27T17:20:47.143 に答える