
stop() を使用せずにスレッドを終了する方法
stop() メソッドを使用してスレッドを終了すると、予期しない動作が発生する可能性があります。この記事では、割り込みを使用したスレッド終了の別のアプローチを紹介します。
stop() の代替方法
stop() とは異なり、割り込みはスレッドに実行を正常に終了するよう通知します。割り込みは Thread.interrupt() メソッドによって実現されます。スレッドが中断されると、InterruptedException がスローされます。
実装例
次のコードを考えてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class HelloWorld {
public static void main(String[] args) throws Exception {
Thread thread = new Thread( new Runnable() {
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
Thread.sleep(5000);
System.out.println( "Hello World!" );
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
thread.start();
System.out.println( "press enter to quit" );
System.in.read();
thread.interrupt();
}
}
|
ログイン後にコピー
この例では、スレッドが作成され、通常どおり開始されます。ユーザーが Enter キーを押すと、メインスレッドは thread.interrupt() を使用してワーカー スレッドに割り込みます。ワーカー スレッドは、InterruptedException をスローして割り込みフラグをクリアすることによって割り込みを処理します。スレッドはループ内で割り込みをチェックしているため、現在の反復が完了すると最終的に実行を終了します。
考慮事項
- 割り込みにより、次のようなメソッドが発生する可能性があります。 sleep() と wait() を使用して InterruptedException をスローします。
- を使用して割り込みを確認することをお勧めします。ループ内で Thread.currentThread().isInterrupted() を使用して、スレッドが割り込み要求に確実に対応できるようにします。
- 場合によっては、Thread.currentThread() を使用して現在のスレッドに割り込みフラグを設定する必要がある場合があります。 catch ブロック内の).interrupt()。
以上が「stop()」を使用せずにJavaでスレッドを安全に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。