Java yield方法解释

本文介绍了Java中的Thread.yield()方法,它用于让当前线程让出CPU执行权,但不保证一定能执行其他线程。文章探讨了yield()在实际应用中的稀少使用,并通过示例代码展示了线程让出执行权后,持有锁的情况。实验结果显示,yield()不会释放锁,导致其他等待同一锁的线程仍会被阻塞。

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

Thread.yield()用法及解释

我们知道在jvm中的并发并非真正的并发,而是cpu将执行过程划分为了时间片,在程序执行过程中,cpu会根据自身的规则分别去调度各个线程。只是这个时间片很短所以给我们的感觉像是并发。某一个线程得到执行也就是这个线程获取到了cpu的执行权。

这里再补充一个刚想到的知识点,与yield无关:每个线程内部都有一个程序计数器大体的作用是用于标记当前执行到的代码行数等信息,当某个线程执行过程中cpu执行权被释放的时候,该线程当前执行的相关数据会被存在程序计数器中,等下次该线程重新获得cpu执行权的时候,jvm会从该线程的程序计数器中恢复该线程之前的执行状态

我们来看一下yield的方法定义:

public static native void yield();

这是个静态native方法,意思是让出当前正在执行的线程的cpu执行权并让其进入可运行状态以允许具有相同优先级的其他线程获得运行的机会,仅仅只有这个作用。但是该方法并不能保证cpu的执行权一定被让出了,正如上面说的,cpu调度哪个线程来执行并不是确定的,所以也有可能当前线程刚刚把执行权让出来马上cpu又将执行权分配给它。该方法在实际应用中其实很少,反正我是没用过。可能的应用场景我觉得应该是某个线程业务中并不是那么重要,所以在某个适当的时机把它让出去让其他的线程先走,例如我觉得像一些应用启动时的日志上报等操作,为了避免它占用过多的cpu资源,先把该线程yield一下。

我们来看个yield的简单使用代码:

public void main() {
    Thread thread1 = new Thread(() -> {
        for (int 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值