フォームの処理ループがあります
while (true) {
doWork();
Thread.sleep(SLEEP_INTERVAL);
}
Runnable私はこれでうまく遊ぶことができ、呼び出されたExecutorServiceときに終了するものを作りたいと思っています。ExecutorService.shutdownNow()
私はこのように書くことを目指しています:
public WorkerTask implements Runnable
{
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
doWork();
try {
Thread.sleep(SLEEP_INTERVAL);
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
ExecutorService簡単なテストでは、タスクが中断されて終了し、がシャットダウンするという点で少なくとも機能しているように見えdoWork()ますsleep。(作業の量doWork()と大きSLEEP_INTERVALさを変えることで、割り込みが発生する場所をほぼ制御できます)。
しかし、グーグルで検索すると、 と を使用Thread.interrupted()した例が表示されThread.currentThread().isInterrupted()ます。前者は中断フラグをクリアし、後者はそれを残すことは理解していますが、他に気にする必要がある違いはありますか?
Thread.currentThread().isInterrupted()orの結果が変数Thread.interrupted()に格納され、volatileその変数がwhileループ テスト条件として使用されるバージョンも見られます。それは単なるスタイルですか、それともそうする必要がありますか? 私が書いたものでは、割り込みフラグが設定されたとき(スレッドがライブのときに受信されるかInterruptedException、フラグをキャッチして再アサートするかによって)とThread.currentThread().isInterrupted()、ループテスト?