Java中的wait()和notify()是多線程編程中常用的兩個關鍵字。這兩個關鍵字的使用可以幫助我們更好地控制線程的執行,避免死鎖等問題。
public synchronized void doSomething() { while (condition) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // do something here notifyAll(); }
wait()方法使當前線程進入等待狀態,直到其他線程調用該對象的notify()或notifyAll()方法,當前線程被喚醒并繼續執行。在調用wait()方法時,必須處于同步代碼塊中,并且調用wait()方法的線程必須持有該對象的鎖。
notify()方法則是通知其他一個在該對象上等待的線程,使其從等待池中移到鎖池中。如果有多個線程在等待該對象的鎖,那么只有其中一個線程會被喚醒。notifyAll()方法則是將所有在該對象上等待的線程全部喚醒。
public synchronized void doSomething2() { // do something here notify(); }
可以看到,在使用wait()和notify()時,需要注意以下幾點:
- wait()和notify()方法只能用于同步代碼塊中。
- wait()方法必須持有該對象的鎖,否則會拋出IllegalMonitorStateException異常。
- wait()方法會釋放持有的鎖,讓其他線程可以獲得鎖并執行。
- notify()方法也必須持有該對象的鎖,否則會拋出IllegalMonitorStateException異常。
- notify()方法會隨機喚醒一個正在等待該對象的線程。
- 使用notify()和notifyAll()時,必須確保等待線程能夠在正確的時間被喚醒,否則會導致程序出現異常。