
sleep、wait、yield、join——简介
线程进入阻塞状态,暂时失去CPU资源 不释放锁资源 sleep时间结束后,线程会自动恢复到就绪状态,等待CPU调度 sleep方法可以在任何地方调用,无需特定环境 线程释放锁资源 需要在synchronized代码块内使用 等待唤醒前,线程处于阻塞状态 唤醒后需要重新获取锁资源 notify和notifyAll方法也需要在synchronized代码块内使用 线程不会进入阻塞状态 线程保持在就绪状态 可能在调用yield后立即被调度执行 只能让同优先级或更高优先级的线程获得执行机会 yield方法可以在任何地方调用,无需特定环境 等待当前线程完成后,继续执行主程序 可以传递进程的返回值,用于处理线程的结果 需要处理InterruptedException异常
发布日期:2021-05-08 06:40:16
浏览次数:8
分类:精选文章
本文共 1456 字,大约阅读时间需要 4 分钟。
sleep、wait、yield、join——线程控制方法简介
在Java编程中,sleep、wait、yield和join是四个常用的线程控制方法,它们各自在不同场景下发挥着重要作用。本文将为您详细解析这四个方法的特点、使用场景及区别。
一、sleep方法
sleep(睡眠)是Thread类的静态方法,用于让当前线程暂停执行。线程在调用sleep方法后,会释放CPU资源,进入阻塞状态。需要注意的是,sleep方法不会释放线程持有的锁资源,因此在调用sleep前需要确保线程持有相应的锁。
sleep方法的特点:
sleep的适用场景:
- 需要让线程暂时等待,给其他线程运行机会
- 适用于不需要持有锁资源的场景
二、wait方法
wait(等待)是Object类的方法,主要用于线程间通信。与sleep不同,wait方法会释放当前线程持有的锁资源,只有在其他线程调用notify或notifyAll方法时,当前线程才能被唤醒。
wait方法的特点:
wait的适用场景:
- 线程间通信
- 需要等待另一个线程通知当前线程才能继续执行的场景
- 需要在synchronized代码块内使用
注意事项:
- 因为wait方法会释放锁资源,所以需要确保调用wait前线程已经持有锁资源
- 如果在非synchronized代码块中调用wait方法,可能会抛出IllegalMonitorStateException异常
三、yield方法
yield(让步)与sleep方法类似,都是Thread类的静态方法,用于暂停当前线程的执行。与sleep不同的是,yield方法不会让线程进入阻塞状态,而是让线程重回就绪状态。线程在调用yield方法后,可能会立即被调度执行,也可能会让其他同优先级或更高优先级的线程获得执行机会。
yield方法的特点:
yield的适用场景:
- 调整线程执行顺序
- 在多线程环境中让线程轮流执行
- 需要控制线程的执行频率
四、join方法
join(加入)是Thread类的方法,用于等待当前线程完成后,主程序继续执行。join方法主要用于等待子线程的执行完成,适用于需要等待异步操作完成的场景。
join方法的特点:
join的适用场景:
- 等待子线程或任务的完成
- 异步操作完成后获取结果
- 主线程需要等待子线程完成后才能继续执行的场景
总结:
- sleep方法适用于需要暂停当前线程而不释放锁资源的场景
- wait方法适用于线程间通信,需要释放锁资源的情况
- yield方法适用于让线程轮流执行,保持就绪状态
- join方法用于等待线程或任务完成,适用于异步编程场景
以上方法各有特点和适用场景,选择合适的线程控制方法,能有效地管理多线程程序的执行流程。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月29日 16时29分02秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
对PostgreSQL数据库结构的宏观理解
2019-03-05
Postgresql 日期和时间类型
2019-03-05
xmin、xmax、cmin、cmax
2019-03-05
《卸甲笔记》-PostgreSQL和Oracle的数据类型的对比系列五:其它类型
2019-03-05
查询某表格上次进行vacuum的时间
2019-03-05
Failed to execute vcredist_x64.exe
2019-03-05
invalid byte sequence for encoding
2019-03-05
Centos7.0系统上使用yum安装相关包时出现KeyboardInterrupt错误
2019-03-05
Highgo Database故障收集脚本
2019-03-05
PostgreSQL中的隐式连接和显式连接
2019-03-05
failed to initialize the database
2019-03-05
Failed to execute vcredist_x64.exe
2019-03-05
invalid byte sequence for encoding
2019-03-05
银河麒麟系统配置apt网络源
2019-03-05
Linux内核结构粗解及关于 shell 通俗理解
2019-03-05
第七周 4.12-4.18
2019-03-05
程序设计入门14 结构体
2019-03-05
程序设计基础75 tips 广度搜索细节问题
2019-03-05
笨办法学python之数据类型
2019-03-05
笨办法学Python之将对象名的字符串类型,转化成相应对象
2019-03-05