【剧前爆米花--爪哇岛寻宝】wait方法的使用细则和线程的五大(六大)状态

文章详细介绍了Java中wait和notify方法的使用,它们在线程同步中的作用,以及线程的五大状态(包括NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING)。wait方法涉及释放锁和等待唤醒,而sleep不会释放锁。此外,文章讨论了线程状态中的RUNNING和READY的区分,以及CPU调度对线程状态的影响。
摘要由CSDN通过智能技术生成

作者:困了电视剧

专栏:《JavaEE初阶》

文章分布:这是关于wait和notify以及线程的五大状态相关的文章,在该文章中,我梳理了wait和notify方法的使用和线程的五大(六大)状态,希望对你有所帮助!

目录

wait和notify方法

wait方法的执行逻辑

wait和sleep的对比

线程的五大状态


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的状态的切换。

以上就是本篇博客的全部内容,如有疏漏欢迎指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值