多线程学习-基础(五)sleep()和yield()的区别(理论)

本文详细对比了Java中sleep()和yield()方法的作用及差异。sleep()将线程置于阻塞状态,而yield()则使其回到就绪状态,可能立即重新运行。sleep()允许低优先级线程运行,但yield()不一定。

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

一、sleep()和yield()的区别
(1)sleep()使当前线程进入停滞状态(即阻塞状态),所以执行sleep()的线程在指定的时间内不会被执行;


(2)yield()只是使当前线程从运行状态转到可运行状态(即就绪状态),所以执行yield()的线程有可能进入到可执行状态之后立马又被执行。


(3)sleep()方法使当前运行的线程休眠一段时间,进入不可运行的阻塞状态,这段时间的长短由程序设定。yield()方法使当前线程回退到可运行状态(即就绪状态),

但是让出的时间是不可定的。实际上yield()方法对应了如下操作:先检测当前是否有相同优先级的线程处于可运行状态,如有,则把CPU的占有权交给此类(包括自己)线程来竞争,否则运行
当前这个调用yield()的线程。


(4)所以yield()方法被称为”退让“,他把运行机会让给了其他同优先级的线程,如果此时只存在当前线程和一个低于当前线程执行优先级的线程,那么仍然会优先执行当前线程。
值得注意的是,这里的优先级只是表示执行的机会的多寡,并不表示优先级高的线程一定就比优先级低的线程先拿到CPU的权限去执行。只是执行概率问题。


(5)sleep()允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍然处于可运行状态,所以不可能让出让较低优先级线程获得CPU运行权的机会,
(此处说的只是一个运行机会的让出,随后到底是哪个线程执行,仍然需要竞争,只是竞争成功的概率多寡而已)。


(6)在一个系统中,如果较高优先级的线程没有调用sleep(),又没有受到I/O阻塞,一般来说那么较低优先级的线程只能等到较高优先级的线程执行结束之后才有机会执行。


(7)经过测试,优先级高的线程执行频率比优先级低的线程要多。但是偶尔也会有优先级低的线程在优先级高的线程之前执行,只是频率低而已。整体表现为,优先级高的线程优先执行。

 

转载于:https://www.cnblogs.com/newwind/p/8902342.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值