在Java中,wait()
方法是Object
类的一个方法,用于让当前线程等待,直到其他线程调用该对象的notify()
或notifyAll()
方法。在多线程协作中,wait()
和notify()
/notifyAll()
方法是非常重要的,它们允许线程之间进行有效的通信和协作。
以下是一个简单的示例,展示了如何使用wait()
和notify()
方法进行多线程协作:
public class SharedResource {
private boolean resourceAvailable = false;
public synchronized void waitForResource() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " is waiting for the resource.");
wait(); // 当前线程等待,直到资源可用
System.out.println(Thread.currentThread().getName() + " has acquired the resource.");
}
public synchronized void releaseResource() {
System.out.println(Thread.currentThread().getName() + " is releasing the resource.");
resourceAvailable = true;
notify(); // 通知等待的线程资源可用
}
}
public class WorkerThread extends Thread {
private SharedResource sharedResource;
public WorkerThread(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
@Override
public void run() {
try {
sharedResource.waitForResource(); // 等待资源
// 在这里执行使用资源的操作
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
SharedResource sharedResource = new SharedResource();
WorkerThread workerThread1 = new WorkerThread(sharedResource);
WorkerThread workerThread2 = new WorkerThread(sharedResource);
workerThread1.start();
workerThread2.start();
try {
Thread.sleep(2000); // 让主线程休眠2秒,以便其他线程有机会运行
} catch (InterruptedException e) {
e.printStackTrace();
}
sharedResource.releaseResource(); // 释放资源
}
}
在这个示例中,我们有一个名为SharedResource
的类,它包含一个布尔变量resourceAvailable
和一个同步方法waitForResource()
。waitForResource()
方法使用wait()
让当前线程等待,直到资源可用。另一个同步方法releaseResource()
将资源设置为可用,并使用notify()
通知等待的线程。
WorkerThread
类继承了Thread
类,并在其run()
方法中调用waitForResource()
方法。在main()
方法中,我们创建了两个WorkerThread
实例,并启动它们。主线程休眠2秒,以便其他线程有机会运行。然后,主线程调用releaseResource()
方法释放资源,这将导致等待的线程继续执行。
这个示例展示了如何使用wait()
和notify()
方法进行多线程协作。在实际应用中,你可能需要根据具体需求调整代码。