在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()
方法时,等待的线程将被唤醒并继续执行。