Javaスレッドの割り込み中断使い方

スレッドを停止する主要なメカニズムが中断され、割り込みは、スレッドを終了することを強制表すものではありません。

これは、シグナルがスレッド取り消しに渡され、協力機構であり、

しかし、どのように、いつ終了することを決定するためのスレッドをしましょう。

この文は、中断されたスレッドのコア原則として記述することができ、テキストでだけ見ては、そのことについてはバーコードで、まだ非常に曖昧です。

1つの パブリック クラスは ThreadEnd 実装のRunnable {
 2  
。3      プライベート 揮発性 スタティック ブール OK = falseに4      @Override
 5      公共 ボイドRUN(){
 6         のための(;;){
 7              IF (にThread.currentThread()isInterruptedを()){
 8。                  システム.out.println(「I割り込みスレッドの状態を入力し、それを実行する方法の終わりであろう」);
 9                  ブレーク ; // それが無限ループのためのものであるため、ループはこのように終了
10              } {
 11                 System.out.println( "I割り込み情報を受け取っていない" );
 12である             }
 13である         }
 14      }
 15  
16  
17  
18である     パブリック 静的 ボイドメイン(文字列[]引数)スローInterruptedExceptionある{
 19。          スレッドのスレッド= 新しい新しいスレッド(新しい新しいThreadEnd() );
 20          Thread.start();
 21である          のThread.sleep(1000年)、
 22は         Thread.interrupt();
 23である          のSystem.out.println( "メインスレッドを終了" );
 24  
25      }
 26 }

6行目では、真のスレッドisInterruptedを()メソッドの戻りを表示死のサイクルを停止します。

スレッドの呼び出しにコードの最初の22行は、スレッド方法、7つの条件が満たされている行、スレッドの最後のアウトを中断します。

そこで質問があります:すべてのスレッドは、両方の割り込み()メソッドによって中断されていませんか?

そのようなロックを待っているスレッドとして例えば、睡眠糸、?それを解決する一つのことで私たちの1。

睡眠眠っているスレッドの割り込みコード

。1つの パブリック クラスは InterruptionSleepThread 実装のRunnable {
 2  
。3      @Override
 。4      公共 無効RUN(){
 。5          トライ{
 。6              ( "あなたはNaiwoをすることができ、50秒にスリープ叔父?"のSystem.out.printlnを);
 。7              のThread.sleepを( 50000); // 睡眠50秒
8。          } キャッチ(InterruptedExceptionあるE){
 9。              のSystem.out.println(「夢のよう叔父ウェイク、糸の端をスローすることにより受信される割り込み休止スレッドに。」);
 10              e.printStackTrace();
 11          }
 12です     }
13      パブリック 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionあるが{
 14          スレッドのスレッド= 新しいスレッド(新しいInterruptionSleepThread())。
15          thread.start()。
16          のThread.sleep(2000 );
17          thread.interrupt()。
18          のSystem.out.println( "主线程结束" )。
19  
20      }
 21 }

印刷結果

 

 

これは(珍しい方法で)目を覚ますには非常にエレガントな方法はありませんが、以上の結果から、実際に撤回され、休止状態のスレッドを実行して印刷します。

実行時に毎回()メソッド()内の睡眠を呼び出して、なぜそれはまた、別の観点から教えてくれる、我々はだけでなく、セキュリティプログラムのため、異常をキャプチャするために、コンパイラを強制します。

ロックのためのプロセス待ち、コードが中断され、

。1つの パブリック クラスは WaitLockThreadInterrupted 拡張スレッドを{
 2  
。3      プライベート 静的のオブジェクト・ロック= 新しい新しいオブジェクト();
 4  
5。     @Override
 6。     公共  無効RUN(){
 7。          のSystem.out.println(「私は次のことを実行するために、ロック解除テストを待ちたいですコード" );
 8          同期(ロック){
 9            ながら真の){
 10                IF (にThread.currentThread()isInterruptedを()){
 11                    のSystem.out.println(" I」は、割り込み信号のスレッドを受信した);
 12                    ブレーク;
13                } {
 14                    のSystem.out.println( "没收到线程中断的信号" )。
15                }
 16            }
 17          }
 18      }
 19  
20      プライベート 静的 ボイド試験()はスローInterruptedExceptionある{
 21          同期(ロック){
 22              スレッドのスレッド= 新しいスレッド(新しいWaitLockThreadInterrupted())。
23              thread.start()。
24              のThread.sleep(1,000 )。
25              Thread.interrupt();
 26              のSystem.out.println( "割り込み信号を発行した" );
 27              Thread.join(); //は、スレッドが終了するまでの試験方法、スレッドをブロックします。
28          }
 29      }
 30  
31である     パブリック 静的 ボイドメイン(文字列[]引数)スローInterruptedExceptionある{
 32        ;試験()は
 33である     }
 34です }

印刷結果

 

印刷結果が、しかし、赤色光の左側が点灯されており、いかなるプリント11行が存在しない、それはスレッドが撤退していないことを示しています。

解析コード:同期()メソッドにおける試験と同じロックオブジェクトと同期して実行

そのため、スレッド22行のスレッドrunメソッドの実装では、あなたは仕事のためのテスト安心ロックロックオブジェクトまで待たなければなりません。

しかしthread.join()メソッドを用いた試験では、私はあなたを手放すことができ、スレッドと他のスレッドが終了すると、私たちに伝えるために。

デッドロック、オーバー。

コードの25行は、割り込み信号が有用送信する場合は、このデッドロック状態は、これは厄介なデッドロックは、ロックを解除することができています。

印刷結果から、割り込み()は、中断されたスレッドがロックを待機していません。

結論:

1.Runnable状態(実行中またはスケジュールのスレッドを待っている)は、()割り込みを中断することができます

2.Block状態(割り込みを使用することはできません(ロック・スレッドを待つ))割り込み

 

おすすめ

転載: www.cnblogs.com/guoyansi19900907/p/12585601.html