www. On IT Road .com
wait()、notify()和notifyAll()方法
Java 中的 Object 类具有三个最终方法,它们允许线程就资源的锁定状态进行通信。
- wait()
它告诉调用线程放弃锁并进入睡眠状态,直到其他线程进入同一个监视器并调用notify()
。wait()
方法在等待之前释放锁,并在从wait()
方法返回之前重新获取锁。wait()
方法实际上与同步锁紧密集成,使用同步机制无法直接提供的功能。
换句话说,我们不可能纯粹在 Java 中实现wait()
方法。它是一种本地方法。
调用wait()
方法的一般语法是这样的:
synchronized( lockObject ) { while( ! condition ) { lockObject.wait(); } //take the action here; }
- notify()
它唤醒一个在同一个对象上调用wait()
的线程。应该注意的是,调用notify()
实际上并没有放弃对资源的锁定。它告诉等待线程该线程可以唤醒。但是,在通知程序的同步块完成之前,实际上不会放弃锁定。
因此,如果通知程序对资源调用notify()
,但通知程序仍需要在其同步块内对该资源执行 10 秒的操作,则一直在等待的线程将需要至少再等待 10 秒释放对象锁定的通知程序,即使已经调用了notify()
。
调用notify()
方法的一般语法是这样的:
synchronized(lockObject) { //establish_the_condition; lockObject.notify(); //any additional code if needed }
- notifyAll()
唤醒在同一个对象上调用wait()
的所有线程。在大多数情况下,优先级最高的线程将首先运行,但不能保证。其他与上面的“notify()”方法相同。
调用notify()
方法的一般语法是这样的:
synchronized(lockObject) { establish_the_condition; lockObject.notifyAll(); }
通常,使用wait()
方法的线程确认条件不存在(通常通过检查变量),然后调用wait()
方法。
当另一个线程建立条件时(通常通过设置相同的变量),它会调用 notify()
方法。
等待和通知机制没有指定具体的条件/变量值是什么。
在调用 wait()
或者 notify()
之前,开发人员可以指定要检查的条件。
java wait 和 notify 之间的区别。
日期:2020-09-17 00:09:45 来源:oir作者:oir