首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 線程睡眠 sleep() 詳解:原理、範例與 wait() 差異對比

     編輯:Java 相關知識

Thread.sleep(millis) 讓**當前執行緒**進入 **TIMED_WAITING** 狀態,指定時間後自動轉為 **RUNNABLE** 等待 CPU 調度。**關鍵特性:不釋放同步鎖 (monitor)**,這與 Object.wait() 根本不同。

基本語法與範例

// 靜態方法,作用於「當前線程」
Thread.sleep(1000);           // 睡 1 秒
Thread.sleep(1500, 500000);   // 1.5 秒 + 500,000 奈秒 (精度視 OS 而定)

// 必須捕獲 InterruptedException
try {
    Thread.sleep(2000);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt(); // 重置中斷標誌
    // 處理中斷邏輯
}

完整驗證範例:每 4 次迴圈睡 100ms


class TaskThread extends Thread {
    @Override public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.printf("%s: %d%n", getName(), i);
            if (i % 4 == 0) {
                try { Thread.sleep(100); } catch (InterruptedException ignored) {}
            }
        }
    }
}

public class SleepDemo {
    public static void main(String[] args) {
        new TaskThread().start();
    }
}

sleep() vs wait() 核心差異

特性Thread.sleep()Object.wait()
所屬類別Thread (靜態)Object (實例)
釋放鎖❌ **持有鎖不釋放**✅ **釋放當前物件鎖**
喚醒方式時間到自動 / interrupt()notify()/notifyAll() / interrupt() / 時間到
呼叫前提無必須持有該物件鎖 (在 synchronized 內)
主要用途延遲、定時、讓出 CPU線程間協作、條件等待

鎖不釋放實證程式碼


public class SleepLockDemo {
    private static final Object LOCK = new Object();

    static class Worker extends Thread {
        @Override public void run() {
            synchronized (LOCK) { // 取得鎖
                for (int i = 0; i < 5; i++) {
                    System.out.printf("%s: %d%n", getName(), i);
                    if (i % 2 == 0) {
                        try { Thread.sleep(200); } catch (InterruptedException ignored) {}
                    }
                }
            } // 釋放鎖
        }
    }

    public static void main(String[] args) {
        new Worker().start(); // Thread-0
        new Worker().start(); // Thread-1
        // 輸出將完整印完 Thread-0 的 0~4,才輪到 Thread-1
        // 證明 sleep 期間鎖未釋放
    }
}

輸出結果


Thread-0: 0
Thread-0: 1
Thread-0: 2
Thread-0: 3
Thread-0: 4
Thread-1: 0
Thread-1: 1
Thread-1: 2
Thread-1: 3
Thread-1: 4

最佳實務

  • 不要在持有鎖時睡眠:會嚴重降低併發度,改用 wait(timeout) 或釋放鎖後再睡。
  • 中斷處理:捕獲 InterruptedException 後**必須**重置中斷標誌 (Thread.currentThread().interrupt()) 或拋出,否則中斷信號丟失。
  • 精度期望:Windows ~15ms 精度,Linux ~1ms;不可用於硬性實時系統。
  • 替代方案:TimeUnit.MILLISECONDS.sleep(100) (可讀性更好)、ScheduledExecutorService (定時任務)、LockSupport.parkNanos (底層阻塞)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved