如何在 Java 中正确使用 wait,notify 和 notifyAll
12个回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
wait和notify,多线程之间需要协调工作。
例如,浏览器的一个显示图片的 displayThread想要执行显示图片的任务,必须等待下载线程downloadThread将该图片下载完毕。如果图片还没有下载完,displayThread可以暂停,当downloadThread完成了任务后,再通知displayThread“图片准备完毕,可以显示了”,这时,displayThread继续执行。
以上逻辑简单的说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制的实现依赖于wait/notify。等待机制与锁机制是密切关联的。每个对象都有wait(),notify(),notifyAll()。因为每个对象都有锁,锁是每个对象的基础。
wait方法会使当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或被其他线程中断。wait方法与notify方法必须在同步块内执行,即synchronized(obj)之内。再者synchronized代码块内没有锁是寸步不行的,所以线程要继续执行必须获得锁,相辅相成。
notify唤醒在此对象等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程(随机)。直到当前的线程放弃此对象上的锁,才能继续执行被唤醒的线程。同wait方法一样,notify只能由持有对像锁的线程来调用。notifyall也一样,不同的是notifyall会唤配所有在此对象锁上等待的线程。
例如,浏览器的一个显示图片的 displayThread想要执行显示图片的任务,必须等待下载线程downloadThread将该图片下载完毕。如果图片还没有下载完,displayThread可以暂停,当downloadThread完成了任务后,再通知displayThread“图片准备完毕,可以显示了”,这时,displayThread继续执行。
以上逻辑简单的说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制的实现依赖于wait/notify。等待机制与锁机制是密切关联的。每个对象都有wait(),notify(),notifyAll()。因为每个对象都有锁,锁是每个对象的基础。
wait方法会使当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或被其他线程中断。wait方法与notify方法必须在同步块内执行,即synchronized(obj)之内。再者synchronized代码块内没有锁是寸步不行的,所以线程要继续执行必须获得锁,相辅相成。
notify唤醒在此对象等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程(随机)。直到当前的线程放弃此对象上的锁,才能继续执行被唤醒的线程。同wait方法一样,notify只能由持有对像锁的线程来调用。notifyall也一样,不同的是notifyall会唤配所有在此对象锁上等待的线程。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询