JUC 原始碼講解:sleep()

acdongla發表於2024-03-13

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 資源佔用仍然很低

JUC 原始碼講解:sleep()

在 stack log 中找到我們建立的執行緒,觀察其為 TIMED_WAITING 狀態

JUC 原始碼講解:sleep()

總結

相關文章