この記事は、以前の記事「Javaマルチスレッド例(i)の詳細な説明」に記載されています。
4. Javaマルチスレッドのブロッキング状態とスレッド制御
いくつかの特定のタイプのJavaブロッキングが上記で言及されています。 Javaスレッドの封鎖を引き起こす主な方法を見てみましょう。
1.Join()
結合 - 実行を継続する前に、1つのスレッドを別のスレッドが完了するのを待たせます。スレッドAがスレッドBのJOIN()メソッドでスレッド実行ボディで呼び出された場合、スレッドAがブロックされ、スレッドBがスレッドBの実行を完了したことがわかった後にのみ、Aは実行を続けます。
public class threadtest {public static void main(string [] args){myrunnable myrunnable = new myRunnable();スレッドスレッド= newスレッド(myrunnable); for(int i = 0; i <100; i ++){system.out.println(thread.currentthread()。getname() + "" + i); if(i == 30){thread.start(); try {thread.join(); //メインスレッドは、実行を続ける前にスレッドスレッドが実行されるのを待つ必要があります} catch(arternedexception e){e.printstacktrace(); }}}}}}}}}}}}}}}}}}}}}}}}}}}}2.Sleep()
スリープ - 現在実行中のスレッドが指定された時間を一時停止し、ブロッキング状態を入力します。眠る期間中、スレッドは準備ができていないため、スレッドは実行する機会がありません。現時点でシステムに他の実行可能スレッドがない場合でも、Sleep in Sleep()は実行されません。したがって、スレッドの実行を一時停止するために、Sleep()メソッドを使用します。
前述のように、新しく作成されたスレッドのstart()メソッドが呼び出されると、スレッドは準備ができている状態に入り、実行するためにいつかCPU時間スライスを取得する場合があります。新しいスレッドを特定の必要に応じてすぐに実行したい場合は、元のスレッドのスリープ(1)を直接呼び出してください。
public class threadtest {public static void main(string [] args){myrunnable myrunnable = new myRunnable();スレッドスレッド= newスレッド(myrunnable); for(int i = 0; i <100; i ++){system.out.println(thread.currentthread()。getname() + "" + i); if(i == 30){thread.start(); {thread.sleep(1); //すぐに実行されるようにスレッドを作成します} catch(arturtedexception e){e.printstacktrace(); }}}}}}}}}}}}}}}}}}}}}}}}}}}}注:CPUがアイドル状態にならず、新しく作成されたスレッドに切り替えるため、1ミリ秒間睡眠で十分です。
3。背景スレッド(デーモンスレッド)
概念/目的:背景スレッドは、主に他のスレッド(比較的前景スレッドと呼ばれる)または「デーモンスレッド」にサービスを提供します。 JVMのガベージコレクションスレッドなど。
ライフサイクル:バックグラウンドスレッドのライフサイクルは、前景スレッドのライフサイクルに関連しています。それは主に反映されています:すべての前景スレッドが死んだ状態に入ると、背景スレッドが自動的に死ぬ(実際、これは理解しやすい。なぜなら、バックグラウンドスレッドの目的は前景スレッドを提供することであるため、すべての前景糸が死んだので、それはまだそれを維持しているのか...素晴らしい!!!)。
バックグラウンドスレッドの設定:スレッドオブジェクトのSetDaemon(True)メソッドを呼び出すと、指定されたスレッドを背景スレッドとして設定できます。
public class threadtest {public static void main(string [] args){thread mythread = new mythread(); for(int i = 0; i <100; i ++){system.out.println( "メインスレッドi ="+i); if(i == 20){mythread.setdaemon(true); mythread.start(); }}}}} class mythread extends thread {public void run(){for(int i = 0; i <100; i ++){system.out.println( "i ="+i); {thread.sleep(1); } catch(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); }}}}スレッドがバックグラウンドスレッドであるかどうかを判断します。スレッドオブジェクトのisdeamon()メソッドを呼び出します。
注:メインスレッドは、デフォルトでは前景スレッド、フォアグラウンドスレッドの作成で作成された子スレッドはデフォルトで前景スレッドであり、背景スレッドで作成されたスレッドはデフォルトでバックグラウンドスレッドです。フォアグラウンドスレッドを背景スレッドとして設定するためにSetDeamon(True)メソッドを呼び出す場合、start()メソッドが呼び出される前に必要です。昨日のスレッドが昨日に死んだ後、JVMはバックグラウンドスレッドに死ぬことを通知しますが、指示を受け取ることから応答まで一定の時間がかかります。
4。スレッド/setPriorityの優先度を変更する():
各スレッドには実行時に特定の優先度があり、優先度が高いスレッドには、実行の機会が増えます。各スレッドには、作成したスレッドと同じ優先度があります。メインスレッドには、デフォルトでは通常の優先度があります。
スレッドの優先度を設定:SetPriority(int priorityLevel)。パラメーターの優先順位範囲は1〜10で、一般的に使用される3つの静的定数値は次のとおりです。
max_priority:10
min_priority:1
norm_priority:5
get thread priority:getPriority()。
注:スレッドの優先度が高いスレッドオブジェクトは、このスレッドが優先度の実行ではなく、より多くの実行機会があることのみを意味します。
public class threadtest {public static void main(string [] args){thread mythread = new mythread(); for(int i = 0; i <100; i ++){system.out.println( "メインスレッドi ="+i); if(i == 20){mythread.setpriority(thread.max_priority); mythread.start(); }}}}} class mythread extends thread {public void run(){for(int i = 0; i <100; i ++){system.out.println( "i ="+i); }}}5。スレッドコンセッション:lied()
Hight()の基本的な役割については、以前のブログ投稿で説明しました。同時に、利回り()メソッドはスレッドの優先度にも関連しています。スレッドがeiled()メソッドを呼び出して実行中の状態から対応状態に切り替えると、CPUは、準備ができた状態スレッドキューからスレッドと同じ優先度または優先度の高いスレッドのみを選択します。
public class threadtest {public static void main(string [] args){thread mythread1 = new mythread1();スレッドmythread2 = new mythread2(); mythread1.setpriority(thread.max_priority); mythread2.setpriority(thread.min_priority); for(int i = 0; i <100; i ++){system.out.println( "メインスレッドi ="+i); if(i == 20){mythread1.start(); mythread2.start(); thread.yield(); }}}}} class mythread1 extends thread {public void run(){for(int i = 0; i <100; i ++){system.out.println( "mythread 1 -i ="+i); }}} class mythread2 extends thread {public void run(){for(int i = 0; i <100; i ++){system.out.println( "mythread 2 -i ="+i); }}}一連の記事:
Javaマルチスレッドインスタンスの説明(i)
Javaマルチスレッドインスタンスの詳細な説明(ii)
Javaマルチスレッドインスタンスの詳細な説明(iii)