Java教程

零基础java自学流程-Java语言进阶64

本文主要是介绍零基础java自学流程-Java语言进阶64,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

notifyAll

public final void notifyAll()

唤醒在这个对象监视器上等待的所有线程。线程通过调用一个WAIT方法来等待对象的监视器。

在当前线程放弃对该对象的锁之前,被唤醒的线程不能继续执行。被唤醒的线程以通常的方式与对象上所有其他主动同步的线程竞争;例如,被唤醒的线程在成为下一个锁定该对象的线程方面没有可靠的特权或劣势。

此方法只能由该对象的监视器所有者的线程调用。有关线程可以通过哪些方法成为监视器所有者的描述,请参见notify方法。

wait

public final void wait(long timeout)

导致当前线程等待,直到另一个线程调用该对象的notify()或notifyAll(),或超过指定的时间。

当前线程必须有这个对象监视器。

这个方法导致当前线程(称为T)将自己置于对象的等待集中,然后放弃对对象的所有同步要求。出于线程调度的目的,线程T被禁用并休眠,直到出现以下四种情况之一:

其他一些线程调用这个对象上的notify,线程T碰巧被随机选择来唤醒。

其他线程调用该对象的notifyAll方法。

其他线程中断线程T。

已到达指定时间。然而,如果timeout为0,线程将等待直到收到通知,而不管实际的时间。

然后将线程T从对象的等待集中删除并重新调度。然后,线程以通常的方式与其他线程竞争对象的同步权;一旦获得了对对象的控制,对象上的所有同步声明都将恢复到它们以前的状态——这是调用WAIT方法时的情况。线程T然后从wait方法的调用中返回。因此,当对象从WAIT方法返回时,它与线程T处于完全相同的状态,就像调用WAIT方法时一样。

线程还可以在不被通知、中断或超时的情况下唤醒所谓的伪唤醒。虽然这种情况在实践中很少发生,但应用程序必须通过测试应该导致线程被提醒的条件来防止它,如果条件不满足则等待。换句话说,等待应该总是在循环中发生,如下面的例子所示:

synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
     }
 

(有关此主题的更多信息,请参阅Doug Lea (Addison-Wesley, 2000)编写的Java并发编程(第二版)或Joshua Bloch编写的有效Java编程语言指南(Addison-Wesley, 2001)中的第50项。

如果当前线程在等待时被另一个线程中断,则会抛出InterruptedException。当以上述方式恢复对象的锁定状态时,将引发此异常。

注意,由于wait方法将当前线程放入一个对象的等待集,所以它只能解锁该对象;在当前线程等待期间,可以与当前线程同步的任何其他对象将保持锁定状态。

此方法只能由该对象的监视器所有者的线程调用。有关线程可以通过哪些方法成为监视器所有者的描述,请参见notify方法。


想要系统学习JAVA推荐JAVA300集
Java300集零基础适合初学者视频教程←点击

这篇关于零基础java自学流程-Java语言进阶64的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!