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

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