Java多线程基础-7:wait() 和 notify() 用法解析

文章详细解释了Java中wait()和notify()方法在多线程同步中的作用,以及它们与sleep()、join()的区别。wait()使得线程释放锁并等待,而notify()唤醒等待同一对象的线程。这些方法需要在同步块中使用,以避免IllegalMonitorStateException。文章还讨论了wait()的超时参数和notifyAll()唤醒所有等待线程的情况,强调了它们在协调线程执行顺序中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程之间是抢占式执行的,线程调度是无序的、随机的,因此线程之间执行的先后顺序是难以预知的。但是,实际开发中,有时我们希望合理地协调多个线程间执行的先后顺序。

虽然 join() 算是一种控制顺序的方式,但它毕竟“功效有限”;而 wait() 和 notify() (notifyAll())可以完成线程执行顺序的协调工作。

wait() 说白了就是让某个线程先暂停下来等一等,而notify() 就是把该线程唤醒,让它能够继续执行。wait()和notify()是Object的方法,只要是个类对象,都可以调用。

目录

一、为什么需要 wait() 和 notify() ?

二、方法用法解析

1、wait() 与 notify()

(1)wait() 的作用、结束等待的条件与使用条件

(2)wait() 与 notify() 的使用示例

​​​(3)分析代码运行结果

(4)join() 与 wait() 的区别

(5)带参数的wait方法:wait(timeout)

(6)notifyAll() 唤醒等待同一对象的全部线程

三、wait() 与 sleep()、join() 的区别

1、wait() 和 sleep()

2、wait() 和join()

四、总结
 


一、为什么需要 wait() 和 notify() ?

举一个典型的例子:

这里,ATM机就看作是锁,而4位老哥就是竞争锁的4个线程。1号老哥在ATM机进进出出,并没有实质性地释放锁;但由于ATM机中始终没钱,1号老哥也取不了钱。1号老哥陷入忙等,其它老哥竞争不到ATM机(即竞争不到CPU资源),一直在阻塞,也什么事情都干不了。

这里就出现了一个问题:线程饿死。 有些同学可能疑惑,线程不是会有记账信息吗?记账信息不就可以解决问题吗?但实际上,线程的记账信息是一个比较宏观的东西,它需要多个线程多运行一段时间才能生成,而上面线程饿死时1号线程进进出出的情况是一瞬间的事情,因此记账信息也无法解决。

而使用 wait() 和 notify() 就可以有效解决上述问题。如果情况是这样的:

wait():发现条件不满足或时机不成熟时,就先让1号线程先阻塞等待。

notify(): 当其它线程构造了一个成熟的条件时,就可以通知唤醒1号。1号被唤醒后,又可以参与锁的竞争了。

这也类似于篮球场上运动员的活动。每个运动员都是独立的 “执行流”,可以认为是一个 “线程”。而完成一个具体的进攻得分动作,则需要多个运动员相互配合,按照一定的顺序执行一定的动作:线 程1 “传球”, 线程2才能 “扣篮”。要扣篮的运动员需要wait传球的运动员把球传过去,才能扣篮;而传球的运动员把球传过去这一操作就类似于notify;扣篮运动员拿到了球,就结束了wait,可以进行后续的操作即扣篮了。


二、方法用法解析

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值