Java多线程之wait、notify、yield、sleep、join解读

本文详细介绍了Java线程的六种状态,包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,并对比了sleep、yield、wait、notify/notifyAll和join等方法的区别及它们对线程状态的影响。通过线程状态转换图,展示了这些方法如何在不同状态间切换,帮助理解Java多线程的控制机制。

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

一、java线程的几种状态

状态 释义
NEW一个创建了但还没有开始启动的线程
RUNNABLE线程start后变为可执行状态,具体是否执行取决于系统cpu调度
BLOCKED阻塞,等待锁,比如等待进入synchronized代码块
WAITING线程里调用了wait/join等方法后进入等待状态
TIMED_WAITING超时等待,类似WAITING,但是有时间限制,时间到了,自动进入RUNNABLE状态
TERMINATED结束

以上六种状态在Thread类中的内部枚举类State中有定义。

二、差异对比

方法归属类方法定义
sleepThreadpublic static native void线程休眠,休眠期间不占用cpu
yieldThreadpublic static native void让出当次cpu的执行权
waitObjectpublic final native void线程等待,并释放拥有的对象锁
notify/notifyAllObject public final native void唤醒等待当前锁的其它线程
joinThread public final synchronized void线程等待,释放锁,并等待其它拥有该锁的线程执行结束

三、详细介绍

几个方法对应的线程状态图如下所示:

1、sleep

当前线程调用Thread.sleep(1000)陷入休眠,进入TIMED_WAITING状态,同时系统内核中会根据sleep中的参数设置一个定时器,定时器倒计时结束后,内核会重新唤醒线程,线程状态进入RUNNABLE状态;

2、yield

上面说到,线程状态在RUNNABLE状态下,由系统cpu决定是否执行,所以该状态下,线程在内核中实际有“运行中”和“就绪”两种状态,当前线程在“运行中”时,调用Thread.yield(),会立即让出cpu的使用权,让cpu执行优先级更高的或其它同优先级的线程,线程从RUNNABLE状态下的“运行中”变为“就绪”。

3、wait

当前线程获取Object锁后,调用Object的wait方法,则会使当前线程进入WAITING或TIMED_WAITING状态,并释放Object的持有锁,当前线程会被放入等待队列中,直到超时或者被其他线程调用锁对象的notify方法唤醒。

5、notify/notifyAll

当前线程获取Object锁后,调用Object的notify/notifyAll方法,会使此前调用了该Object的wait线程从WAITING状态进入RUNNABLE状态,notify只会唤醒一个线程,而notifyAll方法可以唤醒所有线程。

6、join

内部其实就是wait方法,不同于wait的是,它会主动等使用了Object的锁对象的线程彻底执行结束后,自动从WAITING状态进入RUNNABLE状态。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值