在Java的多線程編程中,wait方法是相當常用而且重要的。wait方法可以讓一個線程進入等待狀態並釋放它所持有的鎖。本文將從幾個方面來詳細闡述Java中wait方法的使用。
一、wait方法概述
wait方法屬於Object類中的方法,在使用wait方法時必須在同步化的方法或者同步化塊中,同步化塊的塊對象就是wait方法屬於的對象,即此處的Object。調用wait方法後,線程進入等待狀態並且釋放它所持有的鎖,之後其他線程可以獲得鎖對象進入同步化塊。當wait方法返回時,該線程會重新取得鎖,並繼續執行下去。
二、wait方法的使用步驟
1. 首先獲取該對象的鎖
2. 調用對象的wait()方法,此時該線程會進入到對象的等待池,釋放對象的鎖,只有等待其他線程調用對象的notify()方法,才會重新進入鎖池等待取得對象的鎖。
3. 等待被其他線程喚醒,如果沒有被喚醒,一直處於等待狀態。
4. 當被喚醒時,會重新嘗試去獲取對象的鎖,如果獲取不到,就繼續在等待池中等待。
三、wait方法的示例
下面我們通過一段示例代碼來演示wait方法的使用,代碼中定義了兩個線程對象WaitThread和NotifyThread,WaitThread調用了對象的wait方法,使得該線程進入等待狀態。NotifyThread調用對象的notify方法,使得WaitThread重新取得鎖,並繼續執行。
public class WaitNotifyDemo { private static Object object = new Object(); public static void main(String[] args) { WaitThread waitThread = new WaitThread(); NotifyThread notifyThread = new NotifyThread(); waitThread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } notifyThread.start(); } static class WaitThread extends Thread { @Override public void run() { synchronized (object) { System.out.println("WaitThread 獲取到對象鎖"); try { System.out.println("WaitThread 開始等待"); object.wait(); System.out.println("WaitThread 恢復執行"); } catch (InterruptedException e) { e.printStackTrace(); } } } } static class NotifyThread extends Thread { @Override public void run() { synchronized (object) { System.out.println("NotifyThread 獲取到對象鎖"); object.notify(); System.out.println("NotifyThread 執行notify方法"); } } } }
運行該代碼,輸出如下:
WaitThread 獲取到對象鎖
WaitThread 開始等待
NotifyThread 獲取到對象鎖
NotifyThread 執行notify方法
WaitThread 恢復執行
從輸出結果可以看到,WaitThread獲取到鎖並等待,NotifyThread調用notify方法後WaitThread才被喚醒並繼續執行。如果沒有NotifyThread調用notify方法,則WaitThread將一直處於等待狀態。
四、wait方法的注意事項
1. wait方法必須在同步化塊中使用,否則會拋出IllegalMonitorStateException異常。
2. 如果在等待期間對象的notify方法被調用,但是該線程還未準備好執行,在下次調度時繼續等待。
3. wait方法執行時,線程會釋放它所持有的鎖,但是並不會釋放它所關聯的對象的鎖。
五、wait方法的總結
Java中的wait方法是一個用於線程等待的方法,並可以讓線程釋放它所持有的鎖。在使用這個方法時必須在同步化的方法或者同步化塊中,同步化塊的塊對象就是wait方法屬於的對象,即此處的Object。注意,wait方法會釋放它所持有的鎖,但是並不會釋放它所關聯的對象的鎖,而在等待期間被喚醒的線程需要重新獲取它所關聯的對象鎖才能執行。
原創文章,作者:QPTY,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/134149.html