详解Java 中的 wait 和 notify 方法

引言:

        在 Java 多线程编程中,wait() 和 notify() 方法是用于实现线程间通信的重要工具。它们通常与synchronized关键字结合使用,用于协调多个线程的执行顺序,实现线程间的协作。本文将详细介绍 wait() 和 notify() 方法的使用方式,并通过示例说明其在多线程编程中的应用场景。

由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知.
但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序.
球场上的每个运动员都是独⽴的 "执⾏流" , 可以认为是⼀个 "线程".
⽽完成⼀个具体的进攻得分动作, 则需要多个运动员相互配合, 按照⼀定的顺序执⾏⼀定的动作, 线程
1 先 "传球" , 线程2 才能 "扣篮".

 完成这个协调⼯作, 主要涉及到三个⽅法

  • wait() / wait(long timeout): 让当前线程进⼊等待状态.
  • notify() / notifyAll(): 唤醒在当前对象上等待的线程

一、wait() 和 notify() 方法概述

  • wait(): 当一个线程执行了 wait() 方法后,它会释放当前持有的对象锁,并进入等待状态,直到其他线程调用了相同对象上的 notify() 或 notifyAll() 方法将其唤醒。

  • notify(): 用于唤醒一个正在等待的线程。调用 notify() 方法会随机唤醒等待队列中的一个线程,并使其从 wait() 方法返回。

  • notifyAll(): 用于唤醒所有正在等待的线程。调用 notifyAll() 方法会唤醒等待队列中的所有线程,使它们从 wait() 方法返回。

二、wait() 和 notify() 方法的使用方式

在使用 wait() 和 notify() 方法时,通常需要遵循以下几个步骤:

  1. wait() 方法必须在同步块或同步方法中调用,即在持有对象锁的情况下调用。

  2. 调用 wait() 方法后,线程会释放对象锁,并进入等待状态。

  3. 另一个线程在适当的时机调用相同对象上的 notify() 或 notifyAll() 方法,唤醒等待中的线程。

  4. 被唤醒的线程会重新竞争对象锁,一旦获取到对象锁,它会从 wait() 方法返回,并继续执行。

三、示例:生产者-消费者模式

下面是一个经典的生产者-消费者模式的示例,演示了如何使用 wait() 和 notify() 方法来实现线程间的协作:

public class ProducerConsumer {
    private List<Integer> buffer = new ArrayList<>();
    private final int CAPACITY = 5;

    public void produce() throws InterruptedException {
        synchronized (this) {
            while (buffer.size() == CAPACITY) {
                wait(); // 缓冲区已满,生产者等待
            }
            int value = new Random().nextInt();
            buffer.add(value);
            System.out.println("Produced: " + value);
            notify(); // 唤醒消费者线程
        }
    }

    public void consume() throws InterruptedException {
        synchronized (this) {
            while (buffer.isEmpty()) {
                wait(); // 缓冲区为空,消费者等待
            }
            int value = buffer.remove(0);
            System.out.println("Consumed: " + value);
            notify(); // 唤醒生产者线程
        }
    }
}

        在这个示例中,produce() 方法负责生产数据并将其放入缓冲区,而 consume() 方法负责从缓冲区中消费数据。通过调用 wait() 和 notify() 方法,实现了生产者和消费者线程间的协作,避免了数据竞争和线程间通信的问题。

总结:

  wait() 和 notify() 方法是 Java 多线程编程中非常重要的工具,能够实现线程间的协作和通信。合理地使用这两个方法可以帮助我们编写出高效、可靠的多线程程序,提高程序的性能和可维护性。在实际应用中,需要谨慎地使用这两个方法,避免出现死锁和数据不一致等问题。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值