作者:困了电视剧
专栏:《JavaEE初阶》
文章分布:这是关于wait和notify以及线程的五大状态相关的文章,在该文章中,我梳理了wait和notify方法的使用和线程的五大(六大)状态,希望对你有所帮助!
目录
wait和notify方法
线程的调度是无序的,随机的。但是也有一定的需求场景,需要线程有序执行。
就比如说,大清早有四个顾客去ATM机办理相关业务,第一个人需要取钱,但此时ATM机中没有钱,那么这位顾客就需要等待,等其他人把钱存进去后才能取。
在线程的运行过程中也会存在类似的需求此时我们就需要wait和notify方法来进行灵活的处理。即,wait:发现条件不满足/时机不成熟,就进行阻塞等待。notify:其他线程构造了一个有利的条件,就可以唤醒正在wait的线程。
wait方法的执行逻辑
wait方法在执行的时候分为三个步骤
1.解开当前的锁
2.阻塞等待
3.当收到通知的时候就唤醒,同时尝试重新获取锁
从这里我们可以看出,要想使用wait必须将其放在synchronized的代码块里,因为只有获取到锁之后才能进行解锁操作。
使用wait阻塞等待会让线程进入WAITING状态,同时wait也有一个带参数的版本,参数指定的就是等待的时间,如果使用的是不带参数的版本则不等到notify就一直阻塞,而带参数的版本则是等到一定的时间如果还没有对其进行唤醒操作就自动唤醒。
wait和sleep的对比
相同点:wait有一个带参数的版本用来体现超过时间,和sleep很像。同时wait能被提前唤醒,sleep也能被提前唤醒,这时是否就有同学会有疑问,他们的区别是什么?
区别:
1.初心不同(最大的区别):wait解决的是线程之间的顺序控制,而sleep只是单纯的想让线程休眠一会。
2.wait需要搭配锁使用,而sleep则不需要。
3.往更深的层面想:只是java的sleep和wait看起来像,其他语言/系统也提供的sleep和wait的api,在这些上面差别就比较明显了。
线程的五大状态
一个重写了run方法的线程,在另一个线程中通过调用start方法会启动线程,在这之间,线程的状态是NEW,调用了start方法后线程就会进入RUNNABLE状态,这里有五大状态和六大状态的争议就出现在RUNABLE中,RUNABLE状态可以细分为RUNNING和READY两种状态,顾名思义,RUNNING就是正在运行的状态而READY就是准备中的状态,由于CPU的并发执行,所以线程在start后并不会一直在CPU上运行,也就是说只有当CPU给这个线程一个“时间”后,该线程才会运行,此时就出现了RUNNING和READY的状态的切换。
以上就是本篇博客的全部内容,如有疏漏欢迎指正!