0

私は遊ぶためにこのばかげたプログラムを作成しましたwait()

public class WaitTest {
    public static void main(String [] args) {

      System.out.print("1 ");
      synchronized(args){

        System.out.print("2 ");

        try {
          args.wait();
          args.notifyAll();
        }
        catch(InterruptedException e){ System.out.print("exception caught");}

        System.out.print("3 ");
      }
   }
}

私のマシンでは、wait(100)別のミリ秒数を書き込まない限り、コードは 3 を出力しません。どうしてこれなの?

4

5 に答える 5

7

notifyAll() の前に wait() を実行しています。wait() はブロックしようとしています。タイムアウト値を入力すると、wait() がタイムアウトになり、プログラムが続行されます。プログラムを機能させたい場合は、スレッドを作成し、そこで notifyAll() を実行してください。wait() と notifyAll は、スレッド間同期用に設計されています。

于 2009-12-13T21:57:20.497 に答える
6

waitnotifyAllマルチスレッド用です 。は、他のスレッドがorを呼び出すまで永遠args.wait()に待機します。args.notifyAll()args.notify()

を呼び出すとargs.wait(100)、100ms 待ってタイムアウトし、続行します。

セマフォに精通している場合、それは基本的に待機/通知です。

于 2009-12-13T21:57:38.220 に答える
5

スレッドは 1 つしかありません。wait() は別のスレッドからの通知を待っています。

于 2009-12-13T21:55:52.677 に答える
3

待機しているオブジェクトのモニターに他のスレッドが通知しないため、そこでブロックされているだけです。また、ローカル変数を同期して待機しているため、他のスレッドがそれを呼び出すことはほとんどできませんnotify()

于 2009-12-13T21:57:11.993 に答える
1

http://java.sun.com/docs/books/tutorial/essential/concurrency/guardmeth.htmlから

wait が呼び出されると、スレッドはロックを解放し、実行を中断します。将来のある時点で、 別のスレッドが同じロックを取得して Object.notifyAll を呼び出し、そのロックを待機しているすべてのスレッドに重要な何かが発生したことを通知します。

Java チュートリアルは優れた学習リソースです。

于 2009-12-13T22:37:37.323 に答える