4

このトピックに関して開いているスレッドがいくつかあることは知っていますが、Javaでwait()とnotify()を使用する方法の非常に基本的な例を探しています。「VERYELEMENTARY」とは、単に何かを印刷することを意味します。ありがとう。

編集:これまでに試したことは次のとおりですが、IllegalMonitorStateExceptionが発生します:

public void waiting() {
        for(int i = 0; i < 10; i++) {
            if(i == 5)
                try {
                    this.wait();
                } catch (InterruptedException e) {

                }
            else
                System.out.println(i);
        }
        System.out.println("notify me now");    
        this.notify();
}

4

6 に答える 6

4

待機と通知は、スレッドを使用して一時停止し、中断したところから再開するときに、同期ブロックで使用されます。

Wait はすぐにロックを解除しますが、Nofity は終了ブラケットが検出された場合にのみロックを解除します。

public class Mythread implements Runnable{



public synchronized void goo(){

System.out.println("Before Wait");

wait();

System.out.println("After Wait");


}


public synchronized void foo(){

System.out.println("Before Notify");

notify();

System.out.println("After Notify");

}


public class Test{

public static  void main(String[] args){

Thread t = new Thread(new Mythread);

t.start();

 }
}
于 2012-07-17T16:05:18.047 に答える
2

IllegalMonitorStateException は、wait または notify を呼び出す前にオブジェクトを同期する必要があるためです。そう

this.wait

する必要があります

   synchronized(this) {
      this.wait();
    }

呼び出しに到達しないため、例は実行されませんnotify...スレッドが待機するとすぐに、スレッドは中断され、それ以上進みません。待機/通知が機能するには、2 つのスレッドが必要です。waitメソッドが呼び出されると1 つのスレッドが中断し、最終的に 2 番目のスレッドが呼び出しsynchronized(this) { this.notify() }て、最初のスレッドがウェイクアップし、wait 呼び出しの下で実行を継続します。

通常、待機する前に何らかの条件をチェックするため、同期が必要です。

  synchronized(this) { 
      if(! this.isReady) {
         this.wait(); 
      }
   }

変数をチェックする行と待機する行の間で、他のスレッドが isReady フラグの状態を変更しないように同期する必要があります。したがって、通知コードは

   synchronized(this) {
      isReady = true;
      this.notify();
   }

これで、メソッド呼び出しの順序は問題になりません。最初に通知すると、スレッドは起動しませんが、isReady = true であるためスリープしないので問題ありません。最初にスリープ状態になると、 isReady = true は何もしませんが、通知呼び出しによってスレッドが起動されます。最後に、同期により、スレッド A で変数をチェックせず、次にスレッド B に変数を設定させて (何もせずに) 通知させ、次にスレッド A をスリープ状態にし、決してウェイクアップさせないようにします。

それが役立つことを願っています。

于 2012-07-17T16:40:47.170 に答える
1

wait()notify()はスレッドの同期に使用されます。スレッドはに通知でき、呼び出しwait()を受け取るまで何もしません。notify()

于 2012-07-17T16:00:02.803 に答える
0

見てみましょう:これかsimple prodcuer consumer problem java、Googleで検索してください。あなたのニーズに合ったものがきっと見つかると思います。

于 2012-07-17T16:02:51.670 に答える
0

Oracle Java サイトの保護されたブロックに関するこの例を参照してください。これには、単純な生産者と消費者の問題の実際の例が含まれています。

于 2012-07-17T16:03:04.350 に答える
0

これらの関数の基本的な考え方wait()は、スレッドを一時停止 (スリープ状態にする) し、notify()スレッドがスリープ状態になったときに残った場所から再開することです。

于 2012-07-17T16:00:25.503 に答える