前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于线程中的sleep,wait,yield的区别

关于线程中的sleep,wait,yield的区别

作者头像
我是攻城师
发布于 2018-07-23 02:53:01
发布于 2018-07-23 02:53:01
1.6K0
举报
文章被收录于专栏:我是攻城师我是攻城师

Java的线程里面有几个比较常见的方法如sleep,wait,yield,但是你知道它们之间的区别吗?

首先这三种方法都可以用来暂停线程,sleep和yield方法都定义在Thread类中,而wait方法则定义在Object类中,wait和sleep的关键区别在于前者是用来做线程间通信交流用的,而后者是为了让当前线程在一定的周期内休眠,此外调用wait方法会释放当前线程的锁,而sleep方法则绝不会释放任何监视器。接下来我们再来看下yield方法,它和wait,sleep方法有一些轻微的不同,它仅仅释放当前线程的cpu,让别的线程有机会去运行,当然这里的有机会是有条件的,只有优先级等于或者大于该线程的线程才有可能得到,如果小于该线程优先级的线程是不会得到的,所以其不保证谁会得到cpu资源,它完全依赖线程调度,很大程度上还是该线程会再次获得cpu资源,所以可以理解它是不可靠的,仅仅是提供了一种可能。

关于sleep和wait,yield,这里还得延伸一个概念,那就是关于线程上下文切换,如果当多个线程共享一个cpu的时候,他们其实是通过上下文切换来让每个应用程序都能够获取到一些cpu时间片来执行任务。这里有一个非常基础的概念,一个进程可以通过上下文切换来让另一个进程也有机会运行,即使在单核的系统中,类似于进程切换,多个线程也可以在Jvm进程中自由切换。

提到这里,我们有必要来重新复习一下线程的六种状态:

(1)NEW 是指创建了线程类,但是还没有执行start方法时候的线程状态

(2)RUNNABLE 是指线程在JVM中正在运行,当然这里并不一定就是在操作系统中正在进行,比如说其正在等待分配cpu时间片

(3)WAITING是指当先线程已经进入同步块,但是如果其调用了wait方法,那么它将会无限等待直到有一些线程在同样的监视器条件下调用了notify方法来唤醒它。

(4)BLOCKED 是指当线线程正在等待获取一个监视器,这里需要注意的是在一个WAITING状态的线程如果被调用了notify方法,那么其不会立即切换到RUNNABLE状态,而是会先切成BLOCKED状态等待获取一个监视器锁,如果其他的一些线程得到了锁,那么其将还会切回到WAITING状态

(5)TIMED_WAITING是指当线线程调用了sleep方法或者时调用了wait(timeout)超时的方法。

(6)TERMINATED是指当前线程已经结束。

当线程sleep调用时,会发生什么?

(1)当前线程会被转换为TIMED_WAITING状态在一定间隔周期内

(2)释放当前的cpu资源

(3)当等待的时间过期后,线程不会立刻切换到该线程,如果还有更高优先级的任务在运行。

(4)线程sleep可以被线程的interrupted打断,如果被打断会抛出InterruptedException

当wait方法调用时,会发生什么。

(1)释放当前的cpu资源,进入WAITING状态

(2)释放监视器对象,任何其他的线程可以进入这个同步块

(3)如果同一个监视器下面有线程调用了notify,该线程不会立刻进入运行状态而是为再次请求获得锁,如果没有获得还会回到WAITING状态。

总结:

本文主要介绍了在Java线程里面sleep,wait,yield的区别和联系,他们都有暂停当前线程的功能,但是彼此又有不同的特点,此外线程的状态的改变是需要上下文切换来取得,如果上下文频繁切换的时间大于线程暂停的时间,那么对于程序性能来说是一种损失,在大多使用while循环里面的sleep时,好的习惯是使用wait来代替每次固定间隔的判断,这样会更高效的利用cpu。至于线程的yield,因为具有不确定性,所以使用它并不保证其他的线程就一定能够获得资源来执行任务。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十四)
Object中的wait、notify、notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑
noteless
2019/03/11
1.8K0
sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十四)
Java线程生命周期与状态切换
最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的JDK版本是11。
Throwable
2020/06/23
8670
Java线程状态(生命周期)以及线程状态转换详解
线程状态转换进入等待/超时等待进入等待状态进入超时等待LockSupport类简介过期的suspend和resume方法
用户7886150
2021/04/20
6990
掌握Java线程状态:从NEW到TERMINATED
本文的主要围绕着下面这个问题展开的,在阅读之前可以先自己思考一下问题的答案是什么?
程序猿川子
2024/09/04
1510
掌握Java线程状态:从NEW到TERMINATED
java多线程之六种状态
其中,RUNNABLE状态包括 【运行中】 和 【就绪】; BLOCKED(阻塞态)状态只有在【等待进入synchronized方法(块)】和 【其他Thread调用notify()或notifyAll(),但是还未获得锁】才会进入;
用户9854323
2022/06/25
2900
线程与线程池的那些事之线程篇
线程,线程池,单线程,多线程,线程池的好处,线程回收,创建方式,核心参数,底层机制,拒绝策略,参数设置,动态监控,线程隔离
秦怀杂货店
2021/05/20
3950
wait和sleep
wait和sleep这部分知识点事比较容易混淆和不好理解的知识点,涉及到线程和锁方面的知识点,也是面试当中经常问的知识点,本小结来做一个小结
在水一方
2022/06/14
2.3K0
wait和sleep
(十二)yield、notify、notifyAll、sleep、join、wait(三)
Object.wait(long)要跟Object.notify()/notifyAll()搭配使用。
HaC
2020/12/30
8160
Android并发编程 多线程与锁
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的。
LoveWFan
2018/11/30
9080
并发编程之第三篇(synchronized)
重量级锁竞争的时候,还可以使用自旋来进行优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁),这时当前线程就可以避免阻塞。 自旋重试成功的情况
海仔
2020/02/18
4470
并发编程之第三篇(synchronized)
多线程基础知识(全面):创建线程、线程状态如何变化、wait()、notify()、sleep()、停止线程
一直想着抽时间 学习多线程相关知识,目前整理了多线程的基础部分,特在此记录下,并发安全、线程池等后续再补充。
寻求出路的程序媛
2024/05/01
2550
多线程基础知识(全面):创建线程、线程状态如何变化、wait()、notify()、sleep()、停止线程
线程间的协作(wait/notify/sleep/yield/join)
Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。
用户4283147
2022/10/27
3140
线程间的协作(wait/notify/sleep/yield/join)
线程生命周期,五大状态转换分析
本章学习完成,你将会对线程的生命周期有清楚的认识,并且明白不同状态之间是如何转换的,以及对java线程状态枚举类解读。
公众号 IT老哥
2020/09/16
5580
线程生命周期,五大状态转换分析
Java并发编程之wait、notify和join原理
使用while循环去循环判断一个条件,而不是使用if只判断一次条件;即wait()要在while循环中
冬天vs不冷
2025/01/21
980
Java并发编程之wait、notify和join原理
【Java编程进阶之路 12】线程调度的艺术:sleep与wait方法的深入探讨
在Java多线程编程中,sleep和wait方法对于线程的控制和管理起着至关重要的作用。本文将详细探讨这两个方法的工作原理、使用场景以及它们之间的差异,并通过实例代码来加深理解。
夏之以寒
2024/04/11
1.1K0
Java并发编程之基础
使用FutureTask可以用泛型指定线程的返回值类型(Runnable的run方法没有返回值)
冬天vs不冷
2025/01/21
760
Java并发编程之基础
Java线程状态详解
最近在深入研究Java并发编程,看到网上有很多关于线程状态的总结,有的不全面,有的根本就是错的。因此,在这里我结合最权威的Java源代码,尝试对Java线程状态进行一个详细的解读。
张申傲
2020/09/03
9200
Java线程状态详解
相关推荐
sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十四)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档