Java多线程&JUCDAY31-19-等待唤醒机制(消费者代码实现)

Java多线程&JUCDAY31-19: 等待唤醒机制(消费者代码实现)

在多线程编程中,等待/唤醒机制是协调生产者和消费者之间交互的一种重要方式。本篇重点讨论如何在Java中实现消费者部分的代码,以及如何确保消费者线程在合适的时机被唤醒进行工作。

消费者的角色和行为

在生产者-消费者模型中,消费者的任务是从一个共享的数据缓冲区中取出数据进行处理。消费者需要在缓冲区非空时进行数据的消费,如果缓冲区为空,则需要等待直到生产者生产了新的数据项。

实现思路

  1. 同步:确保消费者在访问共享数据(缓冲区)时与生产者互斥,通常通过synchronized关键字或显式锁(Lock)实现。
  2. 等待条件:当缓冲区为空时,消费者通过调用wait()方法在某个对象的监视器上等待。
  3. 唤醒机制:生产者在生产了新数据并放入缓冲区后,通过notify()notifyAll()唤醒等待的消费者。
  4. 循环检查条件:消费者被唤醒后应重新检查缓冲区的状态,因为存在所谓的“假唤醒”,或者在多消费者的情况下,缓冲区可能已经被其他消费者清空。

示例代码

以下是一个简化的消费者实现,假设存在一个List作为共享的缓冲区:

public class Consumer implements Runnable {
    private final List<Integer> sharedQueue;
    private final int SIZE;

    public Consumer(List<Integer> sharedQueue, int size) {
        this.sharedQueue = sharedQueue;
        this.SIZE = size;
    }

    @Override
    public void run() {
        while (true) {
            try {
                consume();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
                Thread.currentThread().interrupt();
            }
        }
    }

    private void consume() throws InterruptedException {
        synchronized (sharedQueue) {
            while (sharedQueue.isEmpty()) {
                System.out.println("Queue is empty, " + Thread.currentThread().getName()
                        + " is waiting , size: " + sharedQueue.size());
                sharedQueue.wait();
            }
            Thread.sleep(1000); // Simulate consuming time
            int data = sharedQueue.remove(0);
            System.out.println("Consumed: " + data);
            sharedQueue.notifyAll(); // Notify producers and other consumers
        }
    }
}

在这个消费者实现中,consume()方法是同步的,确保在检查缓冲区和修改它时不会与其他线程冲突。如果缓冲区为空,消费者通过调用wait()方法等待。一旦缓冲区有数据,消费者被唤醒(或者定期自唤醒),然后从缓冲区中取出数据项进行处理。处理完成后,调用notifyAll()以可能唤醒正在等待的生产者或其他消费者线程。

注意事项

  • 避免假唤醒:消费者被唤醒后应通过循环而非单次检查来确认条件是否满足。
  • 选择notify()还是notifyAll():在只有一个生产者和一个消费者的情况下,使用notify()可能更高效;但在有多个生产者或消费者的情况下,使用notifyAll()可以避免死锁。
  • 处理中断:当消费者等待时可能会被中断,应妥善处理InterruptedException

结论

在Java多线程环境下,通过正确实现等待/唤醒机制中的消费者部分,可以有效地协调生产者和消费者之间的交互,保证数据的正确处理和程序的流畅运行。消费者的实现需要注意同步控制、条件检查及适时的等待与唤醒,以确保在多线程环境下的线程安全和高效运作。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值