4

ScheduledThreadPoolExecutor.scheduleAtFixedRate(task, rate, ...)を介して定期的に実行するようにスケジュールするタスクがあります。ユーザーはこのタスクを手動でキャンセルできます。これにより、 ScheduledFuture.cancel(true)が呼び出されます。何らかの理由で、おそらくこのタスクをいつキャンセルするかによって、タスクの run() メソッドが終了した後、ワーカー スレッド (executor がタスクを実行するために使用したスレッド) が中断された状態のままになっているように見えます。

ただし、既存のフックを使用して新しいタスクを開始する前に、(プールから取得して再利用した) ワーカー スレッドの中断状態をクリアする必要があります ( ThreadPoolExecutor.beforeExecute()またはThreadPoolExecutor.afterExecute( ) を介して)。ただし、デフォルトの実装ではこれを行いません。

2 つの質問があります。

  • 割り込みステータスが設定された状態でワーカー スレッドが放置されるのはどうしてですか?
  • 新しいタスクを開始する前に、デフォルトの実装が割り込みステータスをクリアしないのはなぜですか?
4

2 に答える 2

5
* How is it that the worker thread is left in a state where the interrupt status is set?
* Why does the default implementation not clear the interrupt status before starting a new task?

答えは次のとおりです。

  • 中断された状態で放置されることはありません。
  • 実装はしますが、適切な場所を探していません

Oracle ライブラリ コードから:

        /*
         * Ensure that unless pool is stopping, this thread
         * does not have its interrupt set. This requires a
         * double-check of state in case the interrupt was
         * cleared concurrently with a shutdownNow -- if so,
         * the interrupt is re-enabled.
         */
        if (runState < STOP &&
            Thread.interrupted() &&
            runState >= STOP)
            thread.interrupt();

ご覧のとおり、executor がシャットダウンしない限り、割り込み状態はワーカー スレッドからクリアされます。

于 2010-11-10T21:52:30.923 に答える
-1

ユーザーはどのようにスレッドを中断していますか?UIコンポーネントを使用している場合、問題はイベントディスパッチスレッドとの同期の問題が原因である可能性があります。

于 2010-11-10T20:57:31.200 に答える