java多线程并发之生产者消费者

本文介绍了Java中的生产者消费者模型,解释了生产者如何产生数据,消费者如何使用数据,并讨论了不同数量的生产者和消费者情况。通过代码示例展示了如何解决数据平衡问题,强调在特定情况下将if改为while以及notify()更改为notifyAll()的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通俗来讲,生产者就是好比如吃自助的时候的厨师,消费者就是我们吃自助的人。只有厨师做了菜,消费者才可以吃;而当没有人吃的时候厨师停止做菜。
在 Java 中,负责产生数据的模块是生产者,负责使用数据的模块是消费者. 生产者消费者解决数据的平衡问题,即先有数据然后才能使用,没有数据时,消费者需要等待。

在此可能生产者与消费者的数量可能是:
1.一个生产者与一个消费者
2.一个生产者多个消费者
3.多个生产者多个消费者

简单地代码例示如下:

package com.company.producerdata;

/***
 * 定义一个操作数据的类
 */
public class ValueOP {
    private String value="";
    //定义方法修改value字段的值
    public void setValue(){
        synchronized (this){
            //如果value的值不是空串就等待
            while (!value.equalsIgnoreCase("")){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //如果是空串设置value字段的值
            String value=System.currentTimeMillis()+"-"+System.nanoTime();
            System.out.println("set设置的值是:"+value);
            this.value=value;
            //this.notify();//只能唤醒一个线程,在多生产者多消费者环境中,不能保证生产者唤醒消费者,如果生产者唤醒生产者可能会出现假死情况
            this.notifyAll();
        }
    }
    //定义方法获取字段的值
    public void getValue(){
        synchronized (this){
            //如果value是空串就等待
            while (value.equalsIgnoreCase("")){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        //不是空串,读取字段值
        System.out.println("get的值是"+this.value);
        this.value="";
        this.notifyAll();
    }
}

其实在遇到这种问题时,只需要将判断if更改为while,将notify()更改为notifyAll()即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值