Java でスレッドがどのように機能するかを理解しようとしており、現在、キャンセル可能なループ スレッドを実装する方法を調査しています。コードは次のとおりです。
public static void main(String[] args) throws Exception {
Thread t = new Thread() {
@Override
public void run() {
System.out.println("THREAD: started");
try {
while(!isInterrupted()) {
System.out.printf("THREAD: working...\n");
Thread.sleep(100);
}
} catch(InterruptedException e) {
// we're interrupted on Thread.sleep(), ok
// EDIT
interrupt();
} finally {
// we've either finished normally
// or got an InterruptedException on call to Thread.sleep()
// or finished because of isInterrupted() flag
// clean-up and we're done
System.out.println("THREAD: done");
}
}
};
t.start();
Thread.sleep(500);
System.out.println("CALLER: asking to stop");
t.interrupt();
t.join();
System.out.println("CALLER: thread finished");
}
私が作成したスレッドは、遅かれ早かれ中断される予定です。そのため、isInterrupted() フラグをチェックして、続行する必要があるかどうかを判断し、一種の待機操作 ( 、、 )InterruptedException
にある場合に処理するために catch も行います。sleep
join
wait
明確にしたいことは次のとおりです。
- この種のタスクに割り込みメカニズムを使用しても問題ありませんか? (持っているのに比べて
volatile boolean shouldStop
) - この解決策は正しいですか?
- InterruptedException を飲み込むのは正常ですか? 誰かが私のスレッドに割り込みを要求したコードが何であったか、私はあまり興味がありません。
- この問題を解決するためのより短い方法はありますか? (主なポイントは「無限」ループを持っていることです)
編集への
呼び出しをinterrupt()
in catch for に追加しましたInterruptedException
。