ThreadPoolExecutors を介して並行タスクを実行します。実行するタスクのセットが 2 ~ 3 あるため、現時点ではThreadPoolExecutorsのマップがあり、一連のタスクをそれらの 1 つに送信できます。
ここで、プールに割り当てられたすべてのタスクがいつ完了したかを知りたいと考えています。その整理方法は、タスクのリストを事前に知っているので、それらを新しく構築されたプールに送信し、プーリング/追跡を開始して、すべてがいつ完了したかを知るように計画します。
1 つの方法として、1 ~ 2 スレッドの別のプールを用意し、他のプールをポーリングしてキューが空になったことを確認します。いくつかのスキャンでそれらが空であると表示された場合 (ポーリングの間に 2 回目のスリープがあり、スキャンが完了したと見なされます)。
別の方法は、クラスをサブクラスThreadPoolExecutor
化し、キューを介してトラックを追跡し、リディングを上書きすることafterExecute(Runnable r, Throwable t)
です。これにより、各タスクがいつ完了したかを正確に知ることができます。ステータスを表示し、すべてがスムーズに進んでいる場合はすべてが完了したことを知ることができます。
2番目の実装はどこにありますか? リスナーが実装できるインターフェースを用意し、それらをサブクラス化されたメソッドに追加するとよいでしょう。
また、実装を探しています:
タイムアウト内にプールをシャットダウンするように要求するには、
タイムアウトしてもシャットダウンが完了しない場合は、
shutdownNow()
これが失敗した場合は、スレッド ファクトリを取得し、そのグループ内のすべてのスレッドを停止します。(ファクトリを設定し、グループまたは他の方法を使用してすべてのスレッドへの参照を取得すると仮定します)
基本的に、プールをクリーンアップして、これをアプリ コンテナーで実行できるようにするための、できる限り確実な方法です。一部のタスクはセレンなどを呼び出すため、スレッドがハングする可能性があります。
最後の溝は、コンテナー (tomcat/jboss) を再起動することですが、それを最後の溝にしたいと考えています。
質問は - これまたは開始するコードのオープン ソース実装を知っていますか?