執行緒的sleep和yield
阿新 • • 發佈:2018-11-08
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相同的效果。