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

wait并且notifyAll用于多线程。 args.wait()永远等到其他线程调用args.notifyAll()args.notify().

当您调用时args.wait(100),它会等待 100 毫秒,超时,然后继续。

如果您熟悉信号量,那基本上就是等待/通知。

于 2009-12-13T21:57:38.220 回答
5

你只有一个线程。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

当调用等待时,线程释放锁并暂停执行。在未来某个时间, 另一个线程将获得相同的锁并调用 Object.notifyAll,通知所有等待该锁的线程发生了重要的事情:

Java 教程是一个极好的学习资源。

于 2009-12-13T22:37:37.323 回答