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