問題:
1は、スレッドを中断します。
2.なぜスレッドをブロック割り込み、例外がスローされます。
コード例:
com.hdwl.nettyパッケージ; publicクラスThreadInterrupted { パブリック静的無効メイン(文字列[] args){ // testNoInterrupted(); // testInterrupted(); testInterruptedWithBlock(); } //テストがブロック割り込みスレッド プライベート静的ボイドtestInterruptedWithBlock (){ MyInterruptedBlockThread MIBT新しい新MyInterruptedBlockThread =(); mibt.start(); 試み{ のThread.sleep(1000); }キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } mibt.interrupt(); //割り込みを設定しますマーク } //非ブロックデモスレッド中断 プライベートの静的な無効testInterrupted(){ MyInterruptedNoBlockThread MIBT新しい新しいMyInterruptedNoBlockThread =を(); mibt.start(); 試み{ のThread.sleep(1000); }キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } mibt.interrupt(); //フラグのセットのスレッドの割り込み } //中断のないデモスレッドマークが割り込み設定されていないため、すべてのスレッドが中断されることはありません。 静的ボイドtestNoInterruptedプライベート(){ MyInterruptedNoBlockThread MIBT新しい新しいMyInterruptedNoBlockThread =(); mibt.start(); } } //ブロックされたスレッドの クラスはスレッド{延びMyInterruptedBlockThread @Override 公共ボイドRUN(){ スレッドはその後、中断位置真である場合を// whileループの終わり ながら(!isInterruptedを()){ ; System.out.printlnは( "......ランニング") のtry { SLEEP (2000); }キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); ブロッキングスレッドが中断された場合、スレッド割り込みがリセットされるマーキング、それが必要である//リセットします 、割り込みを() } } のSystem.out.println(「スレッドの終了!」); } } //非ブロッキングスレッド クラスはスレッド{延びMyInterruptedNoBlockThread @Override 公共ボイドRUNを(){ スレッドが中断位置である場合、//真である、whileループの終わり つつ{(isInterruptedを()!) のSystem.out.println( "......実行"); } のSystem.out.println( "!スレッドの終了"); } }
質問に答えます:
1は、スレッドが中断され、セットの使用が著しく的に割り込みます。
2は、スレッドをブロック割り込み無限のスレッドを中断させないために、例外がスローされます。セット割り込みマークなので、スレッドはすぐに停止しない、CPUのタイムスライスの次の到着を待つ必要があります、スレッドがリターンで終了させることができる方法を中断。ブロックされたスレッドBは、スレッドAに依存した通知(または他の操作は、スレッドBを覚ますために)、そして、Bをスレッドと割り込みラベルを設定すると、Aが死亡したスレッドが、また、スレッドBまで待機しますそれは基礎割り込ま方法、スレッドの割り込み操作することができ、目を覚まします。そのため、スレッドをブロック割り込み、あなたは私たちの、その後の処理を容易にするために、例外をスローする必要があります。