Thread.sleep(millis) 讓當前線程從「運行狀態」進入「休眠(阻塞)狀態」,指定時間後自動轉為「就緒狀態」等待調度。睡眠期間不釋放任何鎖。
class ThreadA extends Thread {
@Override public void run() {
try {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d%n", getName(), i);
if (i % 4 == 0) Thread.sleep(100); // 睡 100ms
}
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
public class SleepTest {
public static void main(String[] args) {
new ThreadA("t1").start();
}
}
| 特性 | sleep() | wait() |
|---|---|---|
| 所屬類別 | Thread | Object |
| 釋放鎖 | 否 | 是 |
| 喚醒條件 | 時間到 / interrupt() | notify() / notifyAll() / interrupt() |
public class SleepLockTest {
private static final Object LOCK = new Object();
static class ThreadA extends Thread {
@Override public void run() {
synchronized (LOCK) {
try {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d%n", getName(), i);
if (i % 4 == 0) Thread.sleep(100);
}
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
public static void main(String[] args) {
new ThreadA("t1").start();
new ThreadA("t2").start();
}
}
結果:t1 連續印完 0~9,t2 才開始,證明睡眠期間 t1 仍持有鎖。
若註解掉 synchronized (LOCK),兩線程會交替執行,因無鎖爭用,睡眠時 CPU 可調度另一線程。
sleep() 拋出 InterruptedException 會清除中斷標誌,捕獲後建議重新設置:Thread.currentThread().interrupt()。sleep() 做精確定時,受系統調度影響誤差較大。