在Java中,wait()方法是Object類的一個方法,用于讓當前線程等待,直到其他線程調用同一個對象的notify()或notifyAll()方法。wait()方法通常與synchronized關鍵字和Lock接口一起使用,以實現線程之間的協調。
以下是使用wait()方法進行線程協調的步驟:
synchronized:為了讓線程能夠調用wait()和notify()方法,需要將對象聲明為synchronized。這樣,一次只有一個線程可以訪問該對象的同步代碼塊。public synchronized void waitForSignal() throws InterruptedException {
wait();
}
wait()方法:在同步代碼塊中,調用wait()方法讓當前線程等待。這將導致線程進入等待狀態,并釋放對象的鎖。public synchronized void waitForSignal() throws InterruptedException {
wait();
}
notify()或notifyAll()方法:當另一個線程需要通知等待的線程時,可以調用對象的notify()或notifyAll()方法。notify()方法只喚醒一個等待的線程,而notifyAll()方法會喚醒所有等待的線程。public synchronized void sendSignal() {
notify(); // 或者使用 notifyAll() 喚醒所有等待的線程
}
Runnable接口的線程類,并在其run()方法中調用同步對象的waitForSignal()和sendSignal()方法。public class MyThread implements Runnable {
private final Object signalObject;
public MyThread(Object signalObject) {
this.signalObject = signalObject;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " is waiting for signal.");
signalObject.waitForSignal();
System.out.println(Thread.currentThread().getName() + " has received the signal.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
MyThread對象并啟動線程。public class Main {
public static void main(String[] args) {
Object signalObject = new Object();
MyThread thread1 = new MyThread(signalObject);
MyThread thread2 = new MyThread(signalObject);
Thread thread1Instance = new Thread(thread1);
Thread thread2Instance = new Thread(thread2);
thread1Instance.start();
thread2Instance.start();
try {
Thread.sleep(1000); // 等待一段時間,以便線程可以執行
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main thread is sending signal.");
signalObject.sendSignal();
}
}
這個示例中,兩個線程thread1和thread2等待一個信號對象signalObject的wait()方法。主線程在啟動子線程后休眠1秒鐘,然后調用signalObject的sendSignal()方法喚醒一個等待的線程。被喚醒的線程將繼續執行并輸出接收到信號的消息。