• Java中的Thread 类中的 yield 方法


    Java中的Thread 类中的 yield 方法

    Thread 类中的 yield 方法是用于线程控制的一种机制,它有助于实现线程之间的协作。yield 方法的作用是提示当前线程让出CPU时间片,将执行机会让给其他具有相同或更高优先级的线程,或者与当前线程具有相同优先级的线程。以下是关于yield 方法的详细解释、优缺点以及示例说明:

    作用

    • yield 方法的主要作用是提醒调度器,当前线程愿意放弃CPU资源,以便其他线程有机会运行。
    • 它有助于实现线程之间的公平竞争,避免某个线程长时间占用CPU导致其他线程无法执行。

    优点

    • 提高多线程程序的效率,尤其在多核处理器上,通过让出CPU时间片,可以使其他线程充分利用CPU资源。
    • 在某些情况下,可以帮助避免线程饥饿(Starvation)问题,即某个线程一直无法获得CPU执行时间的情况。

    缺点

    • 过多地使用yield 可能会降低程序的整体性能,因为它会导致线程频繁切换,造成一定的开销。
    • 不能保证线程调度的精确性,具体的调度依赖于操作系统和线程调度器的实现,可能会有不同的表现。

    示例代码

    下面是一个简单的示例,展示了yield 方法的使用:

    public class YieldExample {
        public static void main(String[] args) {
            Thread thread1 = new Thread(new MyRunnable("Thread 1"));
            Thread thread2 = new Thread(new MyRunnable("Thread 2"));
    
            thread1.start();
            thread2.start();
        }
    
        static class MyRunnable implements Runnable {
            private final String name;
    
            public MyRunnable(String name) {
                this.name = name;
            }
    
            @Override
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.println(name + ": " + i);
                    if (i == 3) {
                        Thread.yield(); // 在第三次迭代时让出CPU时间片
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这个示例中,我们创建了两个线程,并在它们的运行过程中使用 Thread.yield() 让出CPU时间片。请注意,yield 方法的调用是提示性的,操作系统和线程调度器可能会根据自身策略来决定是否实际让出CPU。这里,我们在第三次迭代时调用 yield,让出一次CPU时间片。这有助于在两个线程之间实现更平均的竞争。

  • 相关阅读:
    Java集合之ArrayList与LinkedList
    上传时获取图片和视频宽高(onload和Promise配合使用)
    相似度系列8:unify-BARTSCORE: Evaluating Generated Text as Text Generation
    黑豹程序员-java语法分析入门案例(模拟代码编译器解析过程)
    你是怎么看待程序员不写注释这一事件的呢?
    mysql8.0删除了权限怎么都还在,是连接工具 navicat 的缓存,删了连接,重新连test 账号,权限就好了
    问题求解——嵌套列表
    C进阶-语言文件操作
    LeetCode栈队列集锦
    RxJava的前世【RxJava系列之设计模式】
  • 原文地址:https://blog.csdn.net/sanmansan/article/details/133691118