世外云

java多线程wait用法

在Java中,wait和notify是用于实现线程间通信的两个方法,wait方法可以使当前线程进入等待状态,直到其他线程调用该对象的notify方法唤醒它,notify方法则用于唤醒在该对象上等待的单个线程。

要在多线程中使用wait和notify协议,首先需要创建一个共享对象,然后使用synchronized关键字对该对象进行同步,当一个线程需要等待时,它会调用该对象的wait方法,而当另一个线程需要唤醒等待的线程时,它会调用该对象的notify方法。

java多线程wait用法-图1

下面是一个简单的示例,展示了如何在多线程中使用wait和notify协议:

public class WaitNotifyExample {
    private final Object lock = new Object();
    private boolean isDataAvailable = false;

    public void produce() throws InterruptedException {
        synchronized (lock) {
            while (!isDataAvailable) {
                System.out.println("生产者等待数据可用...");
                lock.wait();
            }
            System.out.println("生产者生产了数据");
            isDataAvailable = false;
        }
    }

    public void consume() throws InterruptedException {
        synchronized (lock) {
            while (isDataAvailable) {
                System.out.println("消费者等待数据可用...");
                lock.wait();
            }
            System.out.println("消费者消费了数据");
            isDataAvailable = true;
            lock.notify();
        }
    }

    public static void main(String[] args) {
        WaitNotifyExample example = new WaitNotifyExample();

        Thread producerThread = new Thread(() -> {
            try {
                example.produce();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread consumerThread = new Thread(() -> {
            try {
                example.consume();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producerThread.start();
        consumerThread.start();
    }
}

在这个示例中,我们创建了一个名为WaitNotifyExample的类,它有一个共享对象lock和一个布尔变量isDataAvailable,生产者线程在生产数据之前会检查isDataAvailable是否为false,如果是,则调用lock.wait()进入等待状态,消费者线程在消费数据之前也会检查isDataAvailable是否为true,如果是,则调用lock.wait()进入等待状态,当生产者生产了数据后,它会将isDataAvailable设置为false,并调用lock.notify()唤醒等待的消费者线程,当消费者消费了数据后,它会将isDataAvailable设置为true,并调用lock.notify()唤醒等待的生产者线程,生产者和消费者线程就可以通过wait和notify协议进行通信了。

相关问题与解答:

1. 为什么需要在同步块中使用wait和notify方法?

java多线程wait用法-图2

答:因为wait和notify方法是Object类的方法,它们只能在同步块或同步方法中被调用,这样可以确保在同一时刻只有一个线程能够访问共享资源,如果直接在非同步代码中使用wait和notify方法,可能会导致线程安全问题。

2. 如果多个线程同时调用同一个对象的wait方法,会发生什么?

答:当多个线程同时调用同一个对象的wait方法时,这些线程都会进入等待状态,只有一个线程会被唤醒并继续执行,其他仍在等待的线程将继续等待,直到被唤醒,这是因为wait方法是公平的,即按照线程请求锁的顺序来唤醒等待的线程,如果希望改变这种公平性,可以使用Lock接口中的相关方法来实现。

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
请登录后评论...
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~