ScheduledThreadPoolExecutor.scheduleAtFixedRate(task, rate, ...)を介して定期的に実行するようにスケジュールするタスクがあります。ユーザーはこのタスクを手動でキャンセルできます。これにより、 ScheduledFuture.cancel(true)が呼び出されます。何らかの理由で、おそらくこのタスクをいつキャンセルするかによって、タスクの run() メソッドが終了した後、ワーカー スレッド (executor がタスクを実行するために使用したスレッド) が中断された状態のままになっているように見えます。
ただし、既存のフックを使用して新しいタスクを開始する前に、(プールから取得して再利用した) ワーカー スレッドの中断状態をクリアする必要があります ( ThreadPoolExecutor.beforeExecute()またはThreadPoolExecutor.afterExecute( ) を介して)。ただし、デフォルトの実装ではこれを行いません。
2 つの質問があります。
- 割り込みステータスが設定された状態でワーカー スレッドが放置されるのはどうしてですか?
- 新しいタスクを開始する前に、デフォルトの実装が割り込みステータスをクリアしないのはなぜですか?