5-让出CPU执行权的yield方法

让出CPU执行权的yield方法

  • Thread类有一个静态的yield方法,当一个线程在调用yield方法时,实际上就是暗示线程调度器请求让出自己的CPU使用,但是线程调度器可以无条件忽略这个暗示。

  • 操作系统是为每个线程分配一个时间片来占有CPU的,正常情况下当一个线程把分配自己的时间片使用完后,线程调度器才会进行下一轮的线程调度,而当一个线程调用了Thread.yield方法的时候,是告诉线程调度器自己占有的时间片还没有使用完的部分,自己不想使用了,这暗示线程调度器现在就可以进行下一轮的线程调度。

  • 当一个线程调用yield方法的时候,当前线程会让出CPU使用权,然后处于就续状态,线程调度器会从线程就绪队列里获取一个线程优先级最高的线程,当然也有可能会调度到刚刚让出CPU的那个线程来获取CPU执行权。

    package com.heiye.learn1;
    
    public class YieldTest implements Runnable {
    
        YieldTest() {
            //创建线程并启动
            Thread t = new Thread(this);
            t.start();
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                //当i=0让出CPU执行权,放弃时间片,进入下一轮调度
                if ((i % 5) == 0) {
                    System.out.println(Thread.currentThread() + " yield cpu...");
                    //让出CPU执行权
                    Thread.yield();
                }
            }
            System.out.println(Thread.currentThread() + " is over");
        }
    
        public static void main(String[] args) {
            new YieldTest();
            new YieldTest();
            new YieldTest();
        }
    }
    
  • image

  • sleep与yield区别

    • 当线程调用sleep方法的时候调用线程会被阻塞挂起指定时间,这期间线程调度器不会去调度该线程。而调用yield方法的时候,线程只是让出自己剩余的时间片,并没有被阻塞挂起,而是直接到线程就绪队列中,线程调度器开始进行下一次的线程调度。当然,线程调度器下一次调度时就有可能调度到当前执行的线程。
posted @ 2021-09-25 21:09  Cherry_Shen  阅读(204)  评论(0)    收藏  举报