我的原則:先會用再說,內部慢慢來
Thread.sleep 與 Object.wait 的區別
1. 作用
- Thread.sleep 的作用是啥:當前thread睡覺,讓出資源。(但是不釋放鎖)
- Object.wait 作用是啥:當前 thread讓出資源。(釋放鎖)
2. 注意點
- 記住鎖是鎖對象,不是鎖住線程
3. 代碼Demo
public class _04_SleepTest {
/*
這裏加入 synchronized 的目的,就是爲了看下 sleep 的時候,釋放不釋放鎖
*/
public synchronized void sleepMethod() throws Exception {
System.out.println(Thread.currentThread().getName() + ",Sleep start-----");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + ",Sleep end-----");
}
public synchronized void waitMethod() throws Exception {
System.out.println(Thread.currentThread().getName() + ",Wait start-----");
wait(1000);
System.out.println(Thread.currentThread().getName() + ",Wait end-----");
}
public static void main(String[] args) throws Exception {
final _04_SleepTest test1 = new _04_SleepTest();
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
test1.sleepMethod();
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
Thread.sleep(10000);//暫停十秒,等上面程序執行完成
System.out.println("-----分割線-----");
final _04_SleepTest test2 = new _04_SleepTest();
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
test2.waitMethod();
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
}
輸出:
Thread-0,Sleep start-----
Thread-0,Sleep end-----
Thread-2,Sleep start-----
Thread-2,Sleep end-----
Thread-1,Sleep start-----
Thread-1,Sleep end-----
-----分割線-----
Thread-3,Wait start-----
Thread-4,Wait start-----
Thread-5,Wait start-----
Thread-3,Wait end-----
Thread-5,Wait end-----
Thread-4,Wait end-----
流程:
1. 通過sleep方法實現的暫停,程序是順序進入同步塊的,只有當上一個線程執行完成的時候,下一個線程才能進入同步方法,sleep暫停期間一直持有monitor對象鎖,其他線程是不能進入的。
2. wait方法則不同,當調用wait方法後,當前線程會釋放持有的monitor對象鎖,
因此,其他線程還可以進入到同步方法,線程被喚醒後,需要競爭鎖,獲取到鎖之後再繼續執行。
4. 結論
最簡單的區別是,wait方法依賴於同步,而sleep方法可以直接調用。
而更深層次的區別在於sleep方法只是暫時讓出CPU的執行權,並不釋放鎖。而wait方法則需要釋放鎖。
5. 番外篇
下一章節:【線程】 Thread.yeild 內部原理 (四)
上一章節:【線程】 Object.wait 內部原理(二)