フォームの処理ループがあります
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()
、ループテスト?