在Java中,處理線程等待的方法有很多種。這里,我將向您展示如何使用wait()
和notify()
方法來處理線程等待。這兩個方法都是Object
類的方法,因此所有的Java對象都可以使用它們。
首先,我們需要創建一個共享資源,例如一個整數變量,以便在線程之間進行通信。我們將使用synchronized
關鍵字來確保在同一時間只有一個線程可以訪問這個資源。
public class SharedResource {
private int counter = 0;
public synchronized void increment() {
counter++;
System.out.println(Thread.currentThread().getName() + " incremented counter to: " + counter);
notifyAll(); // 通知等待的線程
}
public synchronized void decrement() {
counter--;
System.out.println(Thread.currentThread().getName() + " decremented counter to: " + counter);
notifyAll(); // 通知等待的線程
}
public synchronized int getCounter() {
return counter;
}
}
接下來,我們將創建兩個線程類,一個用于遞增計數器,另一個用于遞減計數器。在這兩個類中,我們將使用wait()
方法來讓線程等待,直到另一個線程調用notifyAll()
方法。
public class IncrementThread extends Thread {
private SharedResource sharedResource;
public IncrementThread(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
@Override
public void run() {
while (true) {
synchronized (sharedResource) {
while (sharedResource.getCounter() >= 10) {
try {
System.out.println(Thread.currentThread().getName() + " is waiting...");
sharedResource.wait(); // 讓當前線程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
sharedResource.increment();
}
}
}
}
public class DecrementThread extends Thread {
private SharedResource sharedResource;
public DecrementThread(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
@Override
public void run() {
while (true) {
synchronized (sharedResource) {
while (sharedResource.getCounter() <= 0) {
try {
System.out.println(Thread.currentThread().getName() + " is waiting...");
sharedResource.wait(); // 讓當前線程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
sharedResource.decrement();
}
}
}
}
最后,我們需要在main()
方法中創建這些線程并啟動它們。
public class Main {
public static void main(String[] args) {
SharedResource sharedResource = new SharedResource();
IncrementThread incrementThread = new IncrementThread(sharedResource);
DecrementThread decrementThread = new DecrementThread(sharedResource);
incrementThread.start();
decrementThread.start();
}
}
這個示例中,IncrementThread
和DecrementThread
線程將不斷地遞增和遞減共享資源counter
。當一個線程試圖執行操作時,如果counter
不滿足條件(例如,遞增線程試圖遞增計數器,但計數器已經達到10),則線程將調用wait()
方法并進入等待狀態。另一個線程執行操作并調用notifyAll()
方法時,等待的線程將被喚醒并繼續執行。