我创建了这个愚蠢的程序来玩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)
或其他毫秒数。这是为什么?
答案 0 :(得分:7)
您正在执行notifyAll()之前的wait()。 wait()将阻止。当你输入超时值时,wait()将超时,然后你的程序将继续。如果您希望程序正常工作,请创建一个线程并在那里执行notifyAll()。 wait()和notifyAll是为同步进行同步而设计的。
答案 1 :(得分:6)
wait
和notifyAll
用于多线程。 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是一个很好的学习资源。