为了账号安全,请及时绑定邮箱和手机立即绑定

关于java中线程yield()方法问题

关于java中线程yield()方法问题

收到一只叮咚 2019-03-15 14:15:47
问题一:我知道yield是用来休眠当前线程,但我查看了资料,又说其不会释放锁,所以我就不解了,其明明会将cpu资源给其他线程,那它不释放锁,其他线程有怎么获取cpu资源呢?还是我理解有误?问题二:资料说是相同优先级的线程可以竞争获取资源?那么比它优先级高的有机会吗?
查看完整描述

4 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

yield() 方法和释放不释放锁没有关系,楼主对其作用理解有偏差。

jdk 中的解释为:

调用该方法的线程通知线程调度器当前线程可以让出CPU,线程调度器可以响应或者忽略此请求。

要注意的是:

  • 线程调度器并不一定响应这个请求。

  • 响应请求时,仅仅将当前线程变为可运行状态。其他处于可运行状态的线程将竞争CPU资源,高优先级线程将会比相同优先级的线程有较高的概率获得CPU资源,但并不保证。

另外,需要注意的是,CPU资源和锁的获取并没有直接关系,CPU资源是由系统来分配的。


查看完整回答
反对 回复 2019-04-18
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

  1. 不要混淆cpu和锁,线程交出cpu并不等于一定要交出锁,这个yield只是让出cpu,让其他线程可以使用cpu,但是如果其他线程wait在该线程hold住的锁上的话,那些线程是不会被执行的,其实就是即使运行也还是继续wait。

  2. 所有就绪的线程都可以竞争,高优先级的只是概率大些,但未必一定会先执行。而且刚刚用yield让出cpu的线程也有可能被再次调度到。


查看完整回答
反对 回复 2019-04-18
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

yield不会释放锁,是指不会释放它锁住的一些“动作”,但是让出了cpu资源;

执行yield()的线程有可能在进入到可执行状态后马上又被执行,所以优先级低的线程不能竞争获取资源,
相同优先级的线程可以竞争获取资源,高优先级线程将会比相同优先级的线程有较高的概率获得CPU资源。


查看完整回答
反对 回复 2019-04-18
?
喵喔喔

TA贡献1735条经验 获得超5个赞

问题1:其他线程包括竞争这个“锁”的线程,也包括跟这个“锁”毫无关系的线程。


查看完整回答
反对 回复 2019-04-18
  • 4 回答
  • 0 关注
  • 385 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信