1. 程式人生 > >執行緒的sleep和yield

執行緒的sleep和yield

xl_echo編輯整理,歡迎轉載,轉載請宣告文章來源。更多IT、程式設計案例、資料請聯絡QQ:1280023003,加群298140694。百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!!


sleep 是一個靜態方法,觀察其原始碼可以看到,其中有兩個過載方法,其中一個需要傳入毫秒數,另外一個既需要毫秒數還需要納秒數。

yield 這是一個將執行緒狀態回逆的方法,主要作用是將執行緒從執行狀態轉換到就緒狀態。這個方法很少使用

sleep

sleep主要的作用就是讓執行緒沉睡,sleep方法有以下兩個:

public static native
void sleep(long millis) throws InterruptedException; public static void sleep(long millis, int nanos)throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw
new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && millis == 0)) { millis++; } sleep(millis); }

第一個方法引數就是隻是毫秒值,引數為100,執行緒就休眠100毫秒;
第二個方法引數多一個納秒值,引數為(1000,10),的時候執行緒就休眠1000毫秒10納秒;

我們可以從一個例子看到這個方法的效果:

package com.example.mybatisplusdemo.test;

/**
 * @Author xl_echo
 * @Date 2018/8/8 上午10:53
 **/
public class Test {

  public static void main(String[] args) {
    new Thread(() -> {
      long startTime = System.currentTimeMillis();
      sleep(2_000L);//2_000L 等效2000,這樣在數字較大時,可讀性更強
      long endTime = System.currentTimeMillis();
      System.out.println(Thread.currentThread().getName() + "休眠時間:" + (endTime - startTime));
    }).start();

    long startTime = System.currentTimeMillis();
    sleep(3_000L);
    long endTime = System.currentTimeMillis();
    System.out.println(Thread.currentThread().getName() + "休眠時間:" + (endTime - startTime));
  }

  private static void sleep(long ms) {
    try {
      Thread.sleep(ms);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

如果休眠時間較長,可以參考TimeUnit代替Thread.sleep,程式碼會更優雅,而且不需要計算毫秒值了,直接設定即可。不常見,除非專案有特許要求。這裡不暫時,有興趣的朋友可以去查一下。

這裡不講解yield,所用不多,而且sleep和yield的作用是比較容易分辨的。sleep一定會使Thread進入休眠,但是yield不同,在CPU沒有忽略排程提示的時候進入釋放CPU讓執行緒達到sleep相同的效果。