Java中進入wait狀態的線程被喚醒後會接着上次執行的地方往下執行還是會重新執行臨界區的代碼
用一個例子來說明:
例子原理
啓動一個線程A打印數字,從0打印到9,在數字等於5的時候,進入wait狀態。在線程A啓動後等待兩秒,然後去喚醒剛纔wait的線程(兩秒足夠讓線程A執行到wait處的代碼了),觀察結果是否是連續的?還是重新打印了之前的數字。也就是說是接着執行的還是重新執行的。
public class WaitTest {
private int a = 0;
private synchronized void count(){
for (int i = 0; i < 10; i++) {
System.out.println(i);
if(i == 5){
try {
System.out.println("進入 wait 狀態...");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws InterruptedException {
WaitTest waitTest = new WaitTest();
new Thread(waitTest::count).start();
Thread.sleep(2000);
synchronized (waitTest){
System.out.println("喚醒線程...");
waitTest.notifyAll();
}
}
}
打印結果
0
1
2
3
4
5
進入 wait 狀態...
喚醒線程...
6
7
8
9
通過結果可以看出,進入wait狀態的線程被喚醒後,是接着上次執行的地方接着執行的。
技 術 無 他, 唯 有 熟 爾。
知 其 然, 也 知 其 所 以 然。
踏 實 一 些, 不 要 着 急, 你 想 要 的 歲 月 都 會 給 你。