sleep() 定義在 Thread.java 中,作用是讓「當前線程」休眠,即從「運行狀態」進入「休眠(阻塞)狀態」。休眠時間至少為指定毫秒數;線程喚醒後轉為「就緒狀態」,等待 CPU 調度。
// SleepTest.java
class ThreadA extends Thread {
public ThreadA(String name) { super(name); }
public synchronized void run() {
try {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d\n", this.getName(), i);
if (i % 4 == 0) Thread.sleep(100); // 每 4 次休眠 100ms
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class SleepTest {
public static void main(String[] args) {
ThreadA t1 = new ThreadA("t1");
t1.start();
}
}
t1: 0 t1: 1 t1: 2 t1: 3 t1: 4 t1: 5 t1: 6 t1: 7 t1: 8 t1: 9
兩者都能讓線程進入阻塞狀態,但 wait() 會釋放同步鎖,而 sleep() 不會釋放鎖。
// SleepLockTest.java
public class SleepLockTest {
private static Object obj = new Object();
public static void main(String[] args) {
ThreadA t1 = new ThreadA("t1");
ThreadA t2 = new ThreadA("t2");
t1.start();
t2.start();
}
static class ThreadA extends Thread {
public ThreadA(String name) { super(name); }
public void run() {
synchronized (obj) { // 共享同一把鎖
try {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d\n", this.getName(), i);
if (i % 4 == 0) Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
t1: 0 t1: 1 t1: 2 t1: 3 t1: 4 t1: 5 t1: 6 t1: 7 t1: 8 t1: 9 t2: 0 t2: 1 t2: 2 t2: 3 t2: 4 t2: 5 t2: 6 t2: 7 t2: 8 t2: 9
主線程啟動 t1 和 t2,兩者共享 obj 的同步鎖。t1 運行時雖調用 Thread.sleep(100),但 t2 無法獲取 CPU 執行權,因為 t1 持有鎖未釋放。若註釋掉 synchronized(obj),兩線程則可交替執行。