了解wait()

时间:2009-12-13 21:52:20

标签: java multithreading wait scjp

我创建了这个愚蠢的程序来玩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 ");
      }
   }
}

在我的机器上,代码永远不会打印3,除非我写wait(100)或其他毫秒数。这是为什么?

5 个答案:

答案 0 :(得分:7)

您正在执行notifyAll()之前的wait()。 wait()将阻止。当你输入超时值时,wait()将超时,然后你的程序将继续。如果您希望程序正常工作,请创建一个线程并在那里执行notifyAll()。 wait()和notifyAll是为同步进行同步而设计的。

答案 1 :(得分:6)

waitnotifyAll用于多线程。 args.wait()会等待永远,直到其他线程调用args.notifyAll()args.notify()

当您致电args.wait(100)时,它正在等待100毫秒,超时并继续。

如果你熟悉信号量,那基本上就是wait / notify。

答案 2 :(得分:5)

你只有一个帖子。 wait()正在等待来自另一个线程的通知。

答案 3 :(得分:3)

由于没有其他线程通知你正在等待的对象的监视器,它只是在那里阻塞。由于您正在同步并等待局部变量,因此几乎没有任何其他线程能够在其上调用notify()

答案 4 :(得分:1)

来自http://java.sun.com/docs/books/tutorial/essential/concurrency/guardmeth.html

  

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

Java Tutorial是一个很好的学习资源。