自然の終了スレッド:スロー未処理の例外天然または実行
Javaの実行中のスレッドの終了を作るための3つの方法があります。
スレッドが正常に終了することを1誘導灯。
2. stop()メソッドは、強制的に)(スレッドを終了するが、この方法は推奨されない、停止理由()と一時停止、再開()メソッドは廃止され、それらは予期しない結果に使用されて発生する、停止()これは、スレッドが簡単にデッドロックにつながる)、正しくリソースを解放し(一時停止しません原因
3.スレッド割り込み割り込み()メソッド。
()デッドロックの例をサスペンドします。
パブリッククラスSuspendTest1 { プライベート静的クラスSynchronizedObject { 公共同期無効printString(){ System.out.printlnはは( "始まります- "); (。。にThread.currentThread()のgetName()に等しい( "スレッド-A")){場合 のSystem.out.println( "线程サスペンド..")。 Thread.currentThread()(一時停止)。 } のSystem.out.println( "エンド---")。 } } パブリック静的無効メイン(文字列[] args){ 試み{ SynchronizedObjectオブジェクトは=新しいSynchronizedObject()。 公共ボイドラン(){ System.out.printlnは(にThread.currentThread()のgetName()。)。 object.printString(); } }; thread1.setName( "スレッド-A")。 thread1.start(); TimeUnit.SECONDS.sleep(1)。 新しいスレッドを=スレッド2スレッド(){ @Override ます。public void実行(){ System.out.printlnは( "スレッド2開始..."); object.printString(); System.out.println( "スレッド2終わり..."); } }。 thread2.setName( "スレッドB")。 thread2.start(); }キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } }
スレッド2開始するスレッド2ラン... jstackと一致ブロッキング表示した後、次のようにすると:
"スレッドB" #12 PRIO = 5 os_prio = 0 TID = 0x000000001d169800 NID = 0x8658は、モニタエントリを待っ[0x000000001ddcf000] java.lang.Thread.State:(オブジェクトモニタ上)BLOCKED com.example.SuspendTest1 $ SynchronizedObject.printStringで(SuspendTest1.java:12) -ロック<0x000000076b5a9568>(com.example.SuspendTest1 $ SynchronizedObject)に待機している com.example.SuspendTest1の$ 2.run(SuspendTest1.java:40)で ロックされた所有可能なシンクロナイザ: -なし
これは、スレッド2にobject.printString BLOCKED、呼び出し()ここではデッドロックを発生することが判明しました。
内部動作のprintlnメソッドは、同期ロックが解除されていないため、これが発生します。
公共ボイドのprintln(列X){ 同期(本){ プリント(X)。 改行(); } }
Javaスレッドはプリエンプティブではなく、協調的です
ノンプリエンプティブ:運転中の継続的なプロセスで到達するために重要または緊急のプロセスが存在する場合、(そのステータスは準備ができている必要があります)、現在実行中のプロセスは、システムがすぐに新たに到着した処理にプロセッサを割り当てます、プロセッサを放棄することを余儀なくされます。あなたは、プロセスを終了するために、タスクマネージャを開くと、
共同Javaは:スレッドの呼び出し割り込み()スレッドを中断するための方法を、ないこのスレッドを閉じることを余儀なく、フラグが中断されるスレッドは、スレッドが中断され、真である、人を迎えるために同様のスレッド自体(の決定が、復帰への人あなたが戻って別の問題がある)行っていない。次のように:
A FutureTask、<文字列> =未来の新しい新FutureTask、<>(新新MyCallable()); スレッドスレッド=新しい新しいスレッド(フューチャー); Thread.start(); Thread.interrupt(); //非同期タスクがまだ完了していない場合、タスクは結果を返す前に完了するまでブロックされます)(取得 するSystem.out.println(future.get());
ここでは、それ自体が決定したスレッドの割り込みスレッドがあります。
isInterruptedを()現在のスレッドかどうかのブレークに決定
静的メソッドはfalseに割り込みステータス割り込みフラグで現在のスレッドかどうかを決定する)(中断しました
あなたがメソッドの例外:InterruptedExceptionを投げる場合、実際には呼び出しは()catchブロックで再び自分自身を中断する必要、中断したスレッドにする必要がある場合には、フラグ割り込みスレッドは、falseにリセットされます。