入門
Javaは、安全にスレッドを終了するための任意のメカニズムを提供するが、割り込み機構、すなわちthread.interrupt()メソッドを提供しません。割り込みスレッドがターゲットスレッドの中断はすぐに中断された後、メソッドが呼び出されると言うことではない、共同のメカニズムですが、いくつかのポイントは、自分自身を中断で標的スレッドへの割り込み要求は、ターゲットスレッドは、それ自体がキャンセルされます送信します。すべての状況にスレッドの実行即時の割り込みが、それは可能性がある場合に関係なく、いくつかの矛盾したオブジェクトの状態が発生する原因とするため、この設定が必要です。
テキスト
まず、割り込み関連する方法が導入します
中断()、isInterruptedを()、()中断、Threadクラスの下に配置されている:スレッドごと方法は、3の中断を必要とします。Threadクラスの下にもあり
そのソースコードを見て、対象のスレッドに割り込み要求を送信する最後のスレッドがネイティブメソッド実装の割り込みを呼び出すことがわかります;:()メソッド割り込み
中断()メソッドは、ターゲットスレッドのブール値中断(ローカルメソッドによって実装される)、中断後にリセットし、中断しないの状態に戻りを返します。
isInterruptedを()メソッド:このメソッドは、割り込みステータスをリセットしません、ブール値のスレッドが(ローカルメソッドを介して)中断するかしない返します。
第二に、スレッドが中断されました
スレッドの割り込みがスレッドの状態によって中断することができますは、1つの割り込みやスレッドを待ってブロックされ、1スレッド実行の割り込みで、2つのカテゴリに分類されます。割り込みは、スレッドがいくつかのポイントブレーク実行時に実行された場合、キャンセル、またはスレッドは、このような参加、睡眠との記事で述べた他の方法のように、最も可能性の高い即時割り込み、これらの方法は投げるだろうブロックされた状態になって待ちます中断エラー例外の後、スレッドの状態が中断されていないリセット中断。しかし、状態が割り込みに応答しない、ブロッキング排他状態を阻止するロックとBIOを取得するために、注意してください。JUCパッケージを遮断する応答を遮断するロック方法の間が、このようなlockInterruptibly()。
物語のスレッドに割り込みを伝えるために、次の3つの質問
1.糸切れの目的は何ですか?
なぜスレッドが破る必要がありますか?たまに原因特定の状況に、私たちは、あなたがこのスレッドを中断することができ、実行を継続するために、現在のスレッドを知っている必要はありませんが、時にはあなたは、スレッドを中断するためにいくつかの予期しない必要性が発生しました。具体的にどのような目的ではなく、特定のシーンが、需要は間違いなくあなたが必要とする、そこにスレッドを中断されました。
2、どのようにスレッドの割り込みに対処するには?
そこの2つの一般的なアプローチは、それがコードの運用レベルであれば、あなただけの割り込みスレッドの後にビジネスロジックの処理を行う必要があり、あり、そしてそれが根底にあるスレッドの一部機能が中断されている場合は、例外がスローされ中断してみてください(または、上糸割り込み経験の方法を知らせるために)スレッドを中断するためにリコール割り込みを()キャッチ。
3、割り込み処理の例のJUC
方法ロックにJUCは、一般)(ロック方法がlockInterruptibly割り込みに応答してある)ReentrantLockのロックを(使用され
以下に示す()メソッドの取得(INT引数)ロック。
1つの 公共 最終 ボイド取得(INT 引数){ 2 であれば(tryAcquire(引数)&&! 3 acquireQueued(addWaiter(Node.EXCLUSIVE)、引数)) 4 selfInterrupt(); 5 }
acquireQueuedでは、スレッドの割り込み状態が判断をしなければならないだろう、中断trueを返した場合、スレッドの割り込みステータスを復元するためにselfInterrupt()メソッドを入力してください。しかし、そのロックを取得した後、ここで注意して、応答しないロックを取得する前に、割り込みに応答。
1 静的 ボイドselfInterrupt(){ 2 にThread.currentThread())(割り込み。 3 }
そしてlockInterruptibly()メソッドを見て:
1 公共 ボイド lockInterruptibly()はスローInterruptedExceptionある{ 2 sync.acquireInterruptibly(1 )。 3 } 4 5 公共 最終 ボイド acquireInterruptibly(INT 引数) 6 スローInterruptedExceptionある{ 7 場合(Thread.interrupted()) 8 スロー 新しいInterruptedExceptionあります()。 9 もし(!tryAcquire(引数)) 10 doAcquireInterruptibly(引数); 11 }
これは、最初のロックを取得した後、割り込みステータスが表示されます。ロックを取得する処理で割り込みが発生した場合や、割り込み例外がdoAcquireInterruptiblyメソッドでスローされます。
ここではロックのローカルアナログで私のブロッキング中断は次のとおりです。
1 パブリック クラスReentrantLockDemo { 2 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ 3 のSystem.out.println( "主開始" )。 4 スレッドスレッド1 = 新しいスレッド(新しいLockThreadDemo())。 5 スレッドのスレッド2 = 新しいスレッド(新しいLockThreadDemo())。 6 thread1.start()。 7 のThread.sleep(1000); // 确保スレッド1获取到了锁 8 thread2.start()。//此时スレッド2处于获取锁的阻塞状态 9 thread2.interrupt()。 10 のSystem.out.println( "主要エンド" ); 11 } 12 } 13 14 クラス LockThreadDemoは実装のRunnable { 15 パブリック 静的 ReentrantLockのロック= 新しいReentrantLockのを(); 16 @Override 17 公共 ボイドラン(){ 18 のSystem.out.println(にThread.currentThread()のgetName()+ "実行可能ラン" )。 19 試み{ 20 lock.lock()。 21 System.out.println(にThread.currentThread()のgetName()+ "开始睡眠"。); 22 のThread.sleep(5000 ); 23 のSystem.out.println(にThread.currentThread()のgetName()+ "睡了5秒"。 )。 24 } キャッチ(例外e){ 25 のSystem.out.println(にThread.currentThread()のgetName()+ "実行可能例外:" + E)。 26 } 最後に{ 27 lock.unlock()。 28 } 29 のSystem.out.println(にThread.currentThread()のgetName()+ "上"。 )。 30 } 31 }
結果の実装:
メインスタート スレッド - 0runnable実行 スレッド - 0スタート睡眠 主要エンド スレッド - 1runnable実行 スレッド - 0 5秒スリープ スレッド -0 オーバー スレッド - 1が眠るようになりました スレッド - 1runnable例外:java.lang.InterruptedException:睡眠が中断 スレッド -1以上
私たちは、中断見ることができますし、ロックへのアクセスに影響を与え、最終的に応答割り込み方法を眠れませんでした。
ここに私のブロッキング)(lockInterruptiblyローカルアナログを中断されています。
1 パブリック クラスReentrantLockInterruptableDemo { 2 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ 3 のSystem.out.println( "主開始" )。 4 スレッドスレッド1 = 新しいスレッド(新しいLockThreadInterruptableDemo())。 5 スレッドのスレッド2 = 新しいスレッド(新しいLockThreadInterruptableDemo())。 6 thread1.start()。 7 のThread.sleep(1000); // 确保スレッド1获取到了锁 8 thread2.start()。// 此时スレッド2处于获取锁的阻塞状态 9 thread2.interrupt()。 10 のSystem.out.println( "主要エンド" ); 11 } 12 } 13 14 クラス LockThreadInterruptableDemoは実装のRunnable { 15 パブリック 静的 ReentrantLockのロック= 新しいReentrantLockのを(); 16 @Override 17 公共 ボイドラン(){ 18 のSystem.out.println(にThread.currentThread()のgetName()+ "実行可能ラン" )。 19 トライ{ 20 lock.lockInterruptibly(); 21 のSystem.out.println(にThread.currentThread()のgetName()+ "开始睡眠"。 )。 22 のThread.sleep(5000 ); 23 のSystem.out.println(にThread.currentThread()のgetName()+ "睡了5秒"。 )。 24 } キャッチ(例外e){ 25 のSystem.out.println(にThread.currentThread()のgetName()+ "実行可能例外:" + E)。 26 } 最後に{ 27 のtry { 28 lock.unlock()。 29 } キャッチ(ないIllegalMonitorStateException E){ 30 のSystem.out.println( "スレッドによって" +にThread.currentThread()のgetName() + " 早期に取得していないロックを引き起こす中断。" ); 31である } 32 } 33である のSystem.out.println(スレッド。.currentThread()+ "上"()のgetName ); 34である } 35 }
結果は以下のとおりです。
メインスタート スレッド - 0runnable実行 スレッド - 0スタート睡眠 主要エンド スレッド - 1runnable実行 スレッド - 1runnable例外:java.lang.InterruptedException スレッドをスレッドに起因する - ロック、事前に中断されていませ1のリードを スレッド -1 以上 スレッド - 0 5秒スリープ スレッド -0オーバー
結論
割り込み処理スレッドのために特にマルチスレッドコンポーネントのフレームワークに関連して、比較的一般的です。熟練したプログラマがマルチスレッド習得するために中断状況のスレッドのさまざまな処理する能力は、状況が反映されます。リトル進歩毎日、日本兵のアーチは、是非します!