Javaスレッドスリープ()およびwait()の詳細な説明と例
寝る
1.スリープは、静的なスレッド方法です。これにより、Runnableによって実装されたスレッドが睡眠方法を使用できるようになります。また、スレッドの前にスリープ()メソッドを互いに呼び出してデッドロックを引き起こすことも避けます。
2。スリープ()に実行時にスリープ時間を与える必要があります。睡眠中(ブロッキングスレッド中)、CPUはこのスレッドを放棄し、他のタスクを実行します。睡眠時間が長くなると、スレッドは自動的に目覚めますが、スレッドはすぐに実行されませんが、CPUが他のスレッドと競合するリソースを割り当てるのを待ちます。
3。さらに、このスレッドが以前にロックを取得した場合、睡眠中にロックは放出されません。このマシンロックを待っている他のプログラムは、このスレッドが起きて実行後に実行されるのを待つ必要があります。
睡眠関連コード
public class threadtest2 {public static void main(string [] args){system.out.println( "test our test");スレッドスリープスリープ=新しいスレッドスリープ(); try {thread thread1 = newスレッド(sleep、 "passer a");スレッドスレッド2 =新しいスレッド(スリープ、「通行人B」); thread1.start(); thread2.start(); } catch(Exception e){e.printstacktrace(); } system.out.println( "test is over"); }}クラススレッドスリープ実装runnable {int count = 0; @Override public void run(){system.out.println(thread.currentthread()。getname() + "say:hello sleep !!");カウント(); } public void count(){while(count <20){system.out.println(thread.currentthread()。getname() + "say:count is" + count); {count ++; thread.sleep(100); } catch(Exception e){e.printstacktrace(); }}}}出力ログ
私たちのテストテストは通行人の上にあります。通行人Aは言う:カウントは0パッシャービーBと言う:こんにちは睡眠!!通行人Bは次のとおりです。カウントは1つの通行人です。カウントは2通行人です:カウントは2通行人です。通行人Bは言う:カウントは14 IS 14通行人Aの言う:カウントは14通行人Aの言う
ログを通して、スレッドAとスレッドBが基本的に交互に実行されていることがわかりますが、それらは不規則であり、並行性の問題があります。
この状況は、コードが睡眠時間を100ミリ秒に設定するためです。カウント増分の実行速度は非常に速いため、スレッドはほぼ同時に眠り、その後同時に目覚めて並行性が発生します。
次に、スリープタイミングロックがリリースされるかどうかを確認するために、シンクロナイズブロックを追加する必要があります
public class threadtest2 {public static void main(string [] args){system.out.println( "test our test");スレッドスリープスリープ=新しいスレッドスリープ(); try {thread thread1 = newスレッド(sleep、 "passer a");スレッドスレッド2 =新しいスレッド(スリープ、「通行人B」); thread1.start(); thread2.start(); } catch(Exception e){e.printstacktrace(); } system.out.println( "test is over"); }}クラススレッドスリープ実装runnable {int count = 0; @Override public void run(){system.out.println(thread.currentthread()。getname() + "say:hello sleep !!");カウント(); } public void count(){while(count <20){synchronized(this){system.out.println(thread.currentthread()。getname() + "say:count is" + count); {count ++; thread.sleep(100); } catch(Exception e){e.printstacktrace(); }}}}}}出力ログ
私たちのテスト通行人を始めますAは言う:こんにちは眠り!!通行人Aは言う:カウントは0テストが超越しているので、パッセルビーBは言います:こんにちは睡眠!!通行人Aが言う:カウントは1つの通行人です。カウントは2通行人です:カウントは3通行人です。 13-Passer A Says:Count Is 14 Passer A Says:Count Is 15-Passer A Says A Says A Says A Says A Says:Count Is 17-Passer A Says:Count Is 18 Passer A Say
基本的にスレッドAが実行されているログから見ることができます。これは、睡眠中にマシンロックが常にスレッドA上にあるため、スレッドBがスレッドAがロックを解放するまでのみ待つことができるためです。
待って
1.wait()は、オブジェクトクラスの方法です。 wait()メソッドが呼び出されると、スレッドはオブジェクトに関連付けられた待機プールに入り、持っているロックを解放します。
2。wait()を実行した後、notify()メソッドまたはnotifyall()メソッドを使用するか、待機時間(wait(long time))を設定して、待機スレッドプールのスレッドを覚ます必要があります。
3.wait()は同期ブロックに配置する必要があります。そうしないと、「java.lang.illegalmonitorStateException」例外は実行時に報告されます。
待機関連コード
public class threadtest2 {public static void main(string [] args){system.out.println( "test our test");スレッドスリープスリープ=新しいスレッドスリープ(); try {thread thread1 = new Thread(sleep、 "passman a");スレッドスレッド2 =新しいスレッド(スリープ、「パスマンB」); thread1.start(); thread2.start(); } catch(Exception e){e.printstacktrace(); } system.out.println( "test is over"); }}クラススレッドスリープ実装runnable {int count = 0; @Override public void run(){system.out.println(thread.currentthread()。getname() + "say:hello sleep !!");カウント(); } public void count(){while(count <20){synchronized(this){system.out.println(thread.currentthread()。getname() + "say:count is" + count); {count ++; this.wait(100); } catch(Exception e){e.printstacktrace(); }}}}}}出力ログ
私たちのテスト通行人を始めますAは言う:こんにちは眠り!!通行人Aは言う:カウントは0テストが超越しているので、パッセルビーBは言います:こんにちは睡眠!!通行人Bは次のとおりです。カウントは1つの通行人です。カウントは2通行人Bが言います:カウントは3通行人です。通行人Bは言う:カウントは14 IS 14通行人Aの言う:カウントは15通行人Bの言う:カウントは16パッセルビーAと言う:カウントは17通行人Bと言う:カウントは18通り通路Aと言う:カウントは19
ログを通して、待機の場合、ロックが解放されることがわかります。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!