JUC 原始碼講解:sleep()
丟擲問題
sleep() 能使執行緒進入 TIMED_WAITING 狀態,那麼,在使用sleep()會不會釋放鎖?被中斷了會不會丟擲異常?線上程使用sleep()時,CPU會不會被釋放?我們在原始碼中和實戰中看看答案吧!
檢視原始碼
進入 sleep() 原始碼,可以看到它是一個 native 方法,但是註釋很詳細,讓我們拆開分析一下:
/**
* Causes the currently executing thread to sleep (temporarily cease
* execution) for the specified number of milliseconds, subject to
* the precision and accuracy of system timers and schedulers. The thread
* does not lose ownership of any monitors.
*
* @param millis
* the length of time to sleep in milliseconds
*
* @throws IllegalArgumentException
* if the value of {@code millis} is negative
*
* @throws InterruptedException
* if any thread has interrupted the current thread. The
* <i>interrupted status</i> of the current thread is
* cleared when this exception is thrown.
*/
public static native void sleep(long millis) throws InterruptedException;
我們看到,這個 sleep() 方法丟擲了一個異常,說明是對中斷敏感的
那麼,會不會釋放鎖資源呢?
在第一段中有這樣一句話
The thread does not lose ownership of any monitors.
執行緒不會失去任何鎖!
那麼,在使用 sleep() 時,CPU會不會被釋放呢?我們在文件裡找不到答案,就自己模擬試一下吧!
可以 start 100個Thread執行緒,讓他們都進入 sleep() 狀態,因為有100個執行緒,普通的家用CPU一定會爆掉,這時候,我們在工作管理員中觀察CPU使用率發現,CPU的使用率並沒有顯著的變化!因此,在sleep()的時候,執行緒會釋放掉CPU資源!,感興趣的小夥伴可以手動模擬試一下
模擬思路(可以跳過):
這段程式碼 sleep() 100個執行緒
{
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(new MyThread(), "YY-Thread-"+i).start();
}
}
static class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(500000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
System.out.println("FUNLLY!");
}
}
}
}
觀察到 CPU 資源佔用仍然很低
在 stack log 中找到我們建立的執行緒,觀察其為 TIMED_WAITING 狀態