位置:首页 > Java > 线程让步机制详解与多线程性能优化实践

线程让步机制详解与多线程性能优化实践

时间:2026-08-15  |  作者:电竞小硕  |  阅读:0

线程让步与 yield() 方法

在校园里,经常能看到一群同学一起打篮球。球一旦被某个同学抢到,通常会先在手里运几下,然后再传给别人,接着大家又重新开始抢球。

这个过程,和程序里的线程让步其实很像。

在线程处理中,让步可以通过 yield() 方法来完成。它和 sleep(long millis) 方法有点相似,都会让当前正在运行的线程先停一停。

但关键区别在于,yield()方法并不会阻塞线程。它只是把线程从运行状态切回就绪状态,让系统调度器重新做一次调度。

也就是说,当某个线程调用 yield() 方法后,那些与它优先级相同、或者优先级更高的线程,就有机会先拿到执行权。

下面通过一个案例,具体看一下 yield() 方法该怎么用,如文件1所示。

文件1 Example09.ja va

 1    // 定义YieldThread类继承Thread类
 2    class YieldThread extends Thread {
 3        // 定义一个有参的构造方法
 4        public YieldThread(String name) {
 5            super(name); // 调用父类的构造方法
 6        }
 7        public void run() {
 8            for (int i = 0; i < 5; i++) {
 9               System.out.println(Thread.currentThread().getName()+"---"+i);
 10               if (i == 2) {
 11                    System.out.print("线程让步:");
 12                    Thread.yield(); // 线程运行到此,作出让步
 13               }
 14            }
 15        }
 16    }
 17    public class Example09 {
 18        public static void main(String[] args) {
 19            // 创建两个线程
 20            Thread thread1 = new YieldThread("thread1");
 21            Thread thread2 = new YieldThread("thread2");
 22            // 开启两个线程
 23            thread1.start();
 24            thread2.start();
 25        }
 26    }

运行结果如图1所示。

线程让步机制详解与多线程性能优化实践_wishdown.com

图1 运行结果

案例说明

在文件1里,一共创建了两个线程:thread1 和 thread2,而且它们的优先级是一样的。

两个线程都在循环变量 i 等于 2 时调用了 Thread 的 yield() 方法。也就是主动把当前执行机会让出来,让双方重新去争夺 CPU 的使用权。

从运行结果也能看出来,thread1 输出 2 之后会先让一步,于是执行权切换到 thread2。

同样,thread2 输出 2 之后也会让出执行机会,接着由 thread1 获得执行权。

小提示

通过 yield() 方法可以实现线程让步,让当前正在运行的线程失去CPU使用权,让系统的调度器重新调度一次。

由于Ja va虚拟机默认采用抢占式调度模型,所有线程都会再次抢占CUP资源使用权,所以在执行线程让步后,并不能保证立即执行其他线程

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多