ThreadPoolExecutorについてこのかなり単純な質問があります。次の状況があります。キューからオブジェクトを消費し、それらに適切なワーカータスクを作成して、ThreadPoolExecutorに送信する必要があります。これは非常に簡単です。ただし、シャットダウンシナリオ内では、多くのワーカーが実行キューに入れられる場合があります。これらのタスクの1つが1時間実行されている可能性があり、アプリケーションを比較的高速で正常にシャットダウンする必要があるため、既に処理中のタスクを正常に完了する必要があるときに、キューに入れられたすべてのタスクをThreadPoolExecutorから破棄します。
ThreadPoolExecutorのドキュメントにはremove()メソッドがありますが、削除できるのは特定のタスクのみです。パージ()は、すでにキャンセルされた将来のタスクに対してのみ機能します。私のアイデアは、キューに入れられたすべてのタスクを保持しているキューをクリアすることでした。ThreadPoolExecutorはこの内部キューへのアクセスを提供しますが、ドキュメントには次のように記載されています。
getQueue()メソッドを使用すると、監視とデバッグを目的としたワークキューへのアクセスが可能になります。この方法を他の目的に使用することは強くお勧めしません。
したがって、このキューを取得してクリアすることはできません。また、このドキュメントの抜粋には次のように書かれています。
提供されている2つのメソッド、remove(java.lang.Runnable)とpurge()を使用して、キューに入れられた多数のタスクがキャンセルされた場合のストレージの再利用を支援します。
どのように?確かに、エグゼキュータに送信したすべてのタスクのリストを維持できます。シャットダウンの場合は、すべてのエントリを繰り返し処理し、remove()メソッドを使用してThreadPoolExecutorから削除します...しかし...さあ、これはこのリストを維持するためのメモリの浪費と面倒。(たとえば、すでに実行されたタスクを削除する)
ヒントや解決策に感謝します!