スレッド通信の目的は、スレッドが互いに信号を送信できるようにすることです。さらに、スレッド通信により、スレッドが他のスレッドからの信号を待つこともあります。たとえば、スレッドBは、スレッドAからの信号を待つことができます。これは、スレッドAが処理および完了したという信号です。
wait()メソッド
- メソッドの実行を中断し、このスレッドに待機させ、CPUを使用する権利を一時的に放棄し、他のスレッドがこの同期メソッドを使用できるようにします
notify()メソッド
- この同期パーティーの使用により、待機スレッドの特定の端で待ってください
notifyall()メソッド
この同期方法の使用により、待機の終わりを待っているすべてのスレッドを目覚めさせる
待機方法を使用するタイミング
スレッドで使用される同期メソッドで変数が使用され、この変数を他のスレッドで変更してこのスレッドのニーズを満たす必要がある場合、同期メソッドでWait()メソッドを使用できます。
ここでは、待機と通知の役割を簡単に説明するための例としてクラスの例を挙げます。
チケットの販売など、マルチスレッドでは、各ウィンドウで販売されるチケットの順序がランダムであることをすでに知っています。 2つのチケット販売ウィンドウがある場合、100枚のチケットを順番に販売する必要があることが規定されています。ウィンドウAで1枚のチケットを販売した後、次のチケットはウィンドウBで販売する必要があります。この機能をどのように実装しますか?
まず第一に、私は声明を設定できると思います。 if(i%2 == 0)次にスレッド1が実行されます。そうでない場合はスレッド2の実行ですが、スレッド1とスレッド2の実行はランダムであり、iのサイズで誰が実行されるかを決定するために指定できません。
その後、スレッドでwait()とnotify()を使用できます
スレッド1が終了したら、少し待ってから、スレッド2が実行され、スレッド2が終了した後、スレッド1を起動してから再び目を覚ます
スレッド1が終了したら、少し待ってから、スレッド2が実行され、スレッド2が終了した後、スレッド1を覚ますと
このようにして、スレッド1とスレッド2を順番に実行できます
プログラムを作成する例として10の数字を印刷し、合計2つのクラスMyPrintとMyPrintTestを作成しました
myprint.java
パブリッククラスのmyPrintはrunnable {private int i = 0; @override public void run(){try {print();} catch(arturnedexception e){// todo auto-feenated catch block e.printstacktrace();}} public synchronized void print()throws throws()} furtrededexception {while(i <10){system.out.println(thread.currentthread()。getname()+":"+i); i ++; notify(); try {wait();} catch(interruptedexception e){e.printstacktrace();}}}}}}}結果は図に示されています
スレッド1とスレッド2が互いに交互に印刷するように実装されていることがわかります。
実行中のプロセスを理解するだけです
while(i <10){system.out.println(thread.currentthread()。getname()+":"+i); i ++; notify(); try {wait();} catch(interruptedexception e){e.printstacktrace();}}}}}}}}}}}}I <10の場合、スレッド1を印刷してから、ウェイクアップを実行します。前にスレッドがないため、このステップは実行されません。次に、スレッド1が待機します。スレッド2を実行した後、前のスレッド、つまりスレッド1を目覚めさせてから、スレッド1を印刷します。
このプロセスは、ループが勃発するまで続くため、回転を実行できます
要約します
上記は、スレッド通信における待機と通知の役割について簡単に議論することについてのこの記事の内容全体です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!