java线程类:yield()方法详解!

1.yield()定义:

yield()方法的作用是放弃当前的cpu的资源,将他让给其他的任务去占用cpu执行时间。 但是放弃的时间不确定,有可能刚刚放弃又马上获得cpu时间片。《java多线程编程核心技术》

2.如何更好理解yield()?

  yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

      举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,有可能是其他人先上车了,也有可能是Yield先上车了。(内容来源:https://www.cnblogs.com/java-spring/p/8309931.html

3.实例

(1).未使用yield

package com.springboot.thread;

public class ThreadYield {
    /*
    * yield()方法的作用是放弃当前的cpu的资源,将他让给其他的任务去占用cpu执行时间。
    * 但是放弃的时间不确定,有可能刚刚放弃又马上获得cpu时间片。
    * */
    public static void main(String[] args) {
        Thread  thread  = new Thread(){
            int count = 0;
            @Override
            public void run() {
                long beginTime =System.currentTimeMillis();
                for (int i = 0 ;i<= 50000000; i++) {
                    //Thread.yield();
                    count = count +(i+1);
                }
                long endTime = System.currentTimeMillis();
                System.out.println("Time spent by the program is :" +(endTime-beginTime)+"ms");
            }
        };

        thread.start();
    }
}

运行结果:

Time spent by the program is :20ms

(2).使用yield()

package com.springboot.thread;

public class ThreadYield {
    /*
    * yield()方法的作用是放弃当前的cpu的资源,将他让给其他的任务去占用cpu执行时间。
    * 但是放弃的时间不确定,有可能刚刚放弃又马上获得cpu时间片。
    * */
    public static void main(String[] args) {
        Thread  thread  = new Thread(){
            int count = 0;
            @Override
            public void run() {
                long beginTime =System.currentTimeMillis();
                for (int i = 0 ;i<= 50000000; i++) {
                    Thread.yield();
                    count = count +(i+1);
                }
                long endTime = System.currentTimeMillis();
                System.out.println("Time spent by the program is :" +(endTime-beginTime)+"ms");
            }
        };

        thread.start();
    }
}

运行结果:

Time spent by the program is :3586ms

从运行结果更好的说明了,使用yield()当前线程会主动放弃cpu资源,从而花费了更多时间。

参考资料:

1.java多线程编程核心技术

2.https://www.cnblogs.com/java-spring/p/8309931.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章