Javaでの待機と通知とは何ですか?



JavaでのWaitとNotifyは、スレッドが相互に通信できるようにする2つの最後のメソッドです。この記事は詳細をお手伝いします

Javaの機能により、プログラムの2つ以上の部分を同時に実行できます。各部分はスレッドです。これらのスレッドは、多くの場合、アクションを調整する必要があります。これは、JavaのWaitやNotifyなどのいくつかの最終メソッドを使用して行われます。この記事は、これらの方法を詳細に理解するのに役立ちます。

次の順序でトピックについて説明します。





さぁ、始めよう!

スレッド同期とは何ですか?

マルチスレッドプログラムは、定期的に複数の状況を思い付く可能性があります 詐欺的で驚くべき結果を生み出す同じリソースに到達しようとします。複数のスレッドが共有リソースにアクセスしようとする場合があります。リソースが一度に1つのスレッドのみによって使用されるようにする必要があります。これは、 Javaでの同期。



今ポーリングについて話している。ポーリングは、条件が真になるまで条件を繰り返しテストするプロセスです。このメソッドは、 特定の条件が真であるかどうかを確認します。このメソッドはスレッドに使用できますが、このメソッドは多くのCPUサイクルを浪費します。 実装プロセスが非常に非効率になります。この種のバグを回避するために、JavaのWaitやNotifyなどのメソッドが導入されています。

Wait()メソッドとNotify()メソッドとは何ですか?

マルチスレッドの問題に取り組むために、WaitやNotifyのようなメソッドは 使用されています。 Objectクラスは、スレッドがリソースのロックされたステータスについて通信できるようにするこれらの3つの最終メソッドを使用します。それらは、ガードブロックとも呼ばれます。

Windows8にPHPをインストールする

待つ()

このメソッドにより、スレッドは、別のスレッドがこのオブジェクトのnotify()メソッドとnotifyAll()メソッドを呼び出すまで待機します。このWait()メソッドは、他のスレッドが同じモニターに入り、notify()を呼び出すまで、呼び出し元のスレッドにロックを解除してスリープ状態にするように指示します。このメソッドは、待機する前にロックを解放し、wait()メソッドから戻る前にロックを再取得します。



Wait()メソッドは同期ロックと緊密に統合されています。これは、同期メカニズムから直接利用できない機能を使用して行われます。

構文:

synchronized(lockObject){while(!condition){lockObject.wait()} //ここでアクションを実行します}

現在のスレッドは、そのオブジェクトのモニターを所有している必要があります。同期されたメソッドからのみ呼び出す必要があります。そうしないと、例外がスローされます。

Notify()

このメソッドは、 それが機能する必要があること。と呼ばれる1つのスレッドを起動します 待つ() 同じオブジェクトのメソッド。

呼び出すことに注意してください notify() 最終的にロックをあきらめません。待機中のスレッドに、ウェイクアップできることを通知します。ただし、通知者の同期ブロックが完了するまで、ロックは実際には放棄されません。今、あなたが電話した場合 notify() リソース上で、通知機能が同期ブロック内で10秒間アクションを実行する必要がある場合、通知を送信しても、通知機能がオブジェクトのロックを解放するまで、待機していたスレッドは少なくともさらに10秒間待機する必要があります。 ()が呼ばれていました。

構文:

synchronized(lockObject){// establish_the_condition lockObject.notify()//必要に応じて追加のコード}

NotifyAll()

このメソッドは、同じオブジェクトでwait()を呼び出したすべてのスレッドをウェイクアップするために使用されます。保証されていなくても、ほとんどの状況で最も優先度の高いスレッドが最初に実行されます。その他はnotify()メソッドと同じです。

JavaでWait()とNotify()を使用する理由と方法は?

で待機と通知を使用する必要があります それらはロックに関連していて、オブジェクトにはロックがあるからです。 Javaでの待機と通知は非常に基本的な概念ですが、これらは オブジェクトクラス 。驚いたことに、waitとnotifyを使用してコードを書くのはそれほど簡単ではありません。待機と通知を使用して生産者/消費者問題を解決するコードを記述することで、これをテストできます。 生産者/消費者の例-Javaでの待機と通知-Edurekaここで、私は共有しています キュー そして2つのスレッドと呼ばれる プロデューサー そして 消費者 プロデューサー スレッドは番号を共有キューに入れ、 消費者 スレッドは共有バケットからの数値を消費します。

条件は、アイテムが生成されたら、コンシューマースレッドに通知する必要があり、同様に、消費プロデューサースレッドに通知する必要があることです。このスレッド間コミュニケーションJavaで待機と通知を使用して実現されます。

注意 :W。aitとNotifyメソッドはオブジェクトクラスで定義されています、およびそれらは同期ブロック内で呼び出す必要があります。

public class Thread1 {public static void main(String [] args){Thread2 b = new Thread2()b.start()synchronized(b){try {System.out.println( 'Waiting for 2 to complete ...' )b.wait()} catch(InterruptedException e){e.printStackTrace()} System.out.println( 'Total is:' + b.total)}}} class Thread2 extends Thread1 {int total @Override public void run (){synchronized(this){for(int i = 0 i<=100 i++) { total += i } notify() }}}

上記の例では、Thread2のオブジェクト(b)が同期されていることに注意してください。このbは、メインスレッドがその合計値を出力する前に計算を完了します。

出力:

これで、この記事の終わりになります。 Javaでの待機と通知について。上記の内容があなたの向上に役立つことが証明されたことを願っています 知識。読み続け、探求し続けてください!

また、チェックしてください 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Java開発者になりたい学生および専門家向けに設計されています。このコースは、Javaプログラミングをすぐに開始できるように設計されており、さまざまなJavaのコア概念と高度な概念の両方についてトレーニングします。 Hibernate&Springのように。