1. wait和notify的概念
所谓的wait和notify其实就是等待、通知机制;该机制的作用域join类似;由于多个线程之间是随机调度的,引入wait和notify就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序,此处的干预,不是影响系统的线程调度策略(内核里调度线程任然是无序调度);
简单来说就是在应用程序代码中,让后执行的线程,主动放弃被调度的机会,就可以让先执行的线程,先把对应的代码执行完成;
2. wait和notify的作用
2.1 例子引入
2.2 wait和notify的使用
wait的使用前提必须是当前对象被上锁了才能使用,不能你对象没被上锁,就wait了,那也不知道是在wait谁。
有线程wait后,也必须有其他线程notify来释放这个wait,不然这个wait就会一直阻塞。
2.2.1 没有上锁的wait
2.2.2 当一个线程被wait,但没有其他线程notify来释放这个wait
2.2.3 两个线程,有一个线程wait,有一个线程notify来释放wait
2.2.4 notifyAll
唤醒等待这个对象的所有线程;
假设有很多个线程,都使用同一个对象wait,这时,使用notifyAll,所有使用了这个对象的wait的线程,都会被唤醒。
但是当这些线程都被唤醒时,就要重新获取锁,他们还是要进行锁竞争的,这里也就相当于串行执行了(线程调度还是随机调度的)。而且使用notifyAll后,全部使用同一对象wait的线程,都被唤醒了,不好控制,更加推荐使用notify。
2.3 wait的三个选项
没有参数的就是死等,但是很多情况,死等是不合理的,所以我们加参数,就是让某个线程在一定时间wait,如果超出了这个时间,就不wait了,直接去掉wait。
有一个参数的精确范围是毫秒级别,两个参数的精确范围是纳秒级别。
3. wait、sleep、join的区别
wait:需要搭配synchronized使用,线程wait时,处于WAITING状态,需要其他线程notify后,才能被唤醒,或者设置时间,到时就唤醒,可以兜底。
sleep:线程sleep时,要到一定休眠时间才能被唤醒,但是也能被interrupt终止,但是这种情况是会抛异常的,是非常规手段,不符合我们预期的效果。
join:啥线程调用join,当前线程就要等啥线程执行完,才能之前当前线程;和wait一样有参数可以选择,到时就不等了。
ps:本次的内容就到这里了,如果感兴趣的话就请一键三连哦!!!