温馨提示×

java wait()方法如何进行多线程协作

小樊
83
2024-12-06 03:29:56
栏目: 编程语言

在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()方法进行多线程协作。在实际应用中,你可能需要根据具体需求调整代码。

0