06.yield

Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程。(可能没有效果) yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会。因此,使用yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次选中。 结论:大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

/**
 *  sleep 与 yield 方法的区别在于,当线程调用 sleep 方法时调用线程会被阻塞挂起指定的时间,
 *  在这期间线程调度器不会去调度该线程。 而调用 yield 方法时,线程只是让出自己剩余的时间片,
 *  并没有被阻塞挂起,而是处于就绪状态,线程调度器下一次调度时就有可能调度到当前线程执行
 */
public class YieldDemo implements Runnable{
    YieldDemo(){
        Thread t = new Thread(this);
        t.start();
    }
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            //当 i=O时让出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 YieldDemo();
        new YieldDemo();
        new YieldDemo();
        //执行多次输出结果样式
        //Thread[Thread-0,5,main] yield cpu...
        //Thread[Thread-1,5,main] yield cpu...
        //Thread[Thread-2,5,main] yield cpu...
        //Thread[Thread-0,5,main] is over
        //Thread[Thread-1,5,main] is over
        //Thread[Thread-2,5,main] is over
        //输出了第一行后当前线程让出了 CPU 执行权

        //注释Thread.yield();
        //执行多次输出结果存在同一线程的两行输出在一起
        //Thread[Thread-0,5,main] yield cpu...
        //Thread[Thread-0,5,main] is over
        //Thread[Thread-1,5,main] yield cpu...
        //Thread[Thread-1,5,main] is over
        //Thread[Thread-2,5,main] yield cpu...
        //Thread[Thread-2,5,main] is over
    }
}
posted @ 2019-08-16 09:34  fly_bk  阅读(151)  评论(0编辑  收藏  举报