线程基础(三十三)

本文由叩丁狼高级讲师王一飞撰写,详细解释了Producer-Consumer模式的概念、角色、特征和应用场景。该模式旨在确保生产者线程安全地将数据交给消费者线程处理。文中还提到了在只有一个生产者和消费者时,该模式转变为Pipe模式,并讨论了通道(Channel)角色的重要性,以确保数据操作的安全性和异步操作的优势。此外,文章还给出了具体的演示案例,并分析了使用ArrayList、队列、栈和优先队列等不同数据结构的影响。Producer-Consumer模式广泛应用于MQ中间件和Java的 BlockingQueue 接口实现,如ArrayBlockingQueue、LinkedBlockingQueue等。

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

本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。

接上篇,本篇讲解线程另外一个设计模式:Producer-Consumer Pattern.

概念

Producer是生产,生产者的意思, 指生产数据的线程, Consumer 则是消费,消费者的意思. 指使用数据的线程.

Producer-Consumer 模式主要目标:生产者生产数据能安全得交给消费者进行处理.

当Producer 跟 Consumer 都为一个线程时, Producer-Consumer 模式就变为Pipe模式

参与角色

Producer-Consumer模式参与角色:
Data: 资源对象(数据对象)
Data角色由Producer角色生成,供Consumer角色使用,一般都需要放置到一个容器(Channel角色)中进行安全管理.

Producer: 生产者
Producer角色生成Data角色,并将其传递给Channel角色存放, Consumer角色再从Channel角色中获取Data角色

Consumer:消费者
Consumer角色从Channel角色中获取Producer角色生成Data角色, 并使用

Channel:通道
Channel角色保管Producer角色生成的Data角色,还能响应Consumer角色处理Data角色的请求,传递Data角色,一般而言,为了确保Data的安全性, Channel角色对Producer角色跟Consumer角色的访问执行互斥处理.

当Channel角色满足接收Data角色条件时, 才接纳Producer角色生成的Data角色, 否则Producer角色一直等待,直到条件满足.
当Channel角色满足传递Data角色条件时,才将Data角色传递给Consumer角色,否则Consumer角色一直等待,直到条件满足.
image.png

模式特征:

1:存在数据创建对象(producter)
2:存在数据使用对象(consumer)
3:存在数据存储对象(channel)
4:存在被操作的对象(data)
5:存在操作条件控制(channel接受与传递data条件)

演示案例

需求:5个生产者生产Data数据, 5个消费者消费Data数据, data至多只能存放10个, 超过10个, 生产者等待, 少于1个消费者等待.

//数据
public class Data {
   
   
    public void show(){
   
   
        System.out.println("data对象 dosomething....");
    }
}
//通道
public class Channel {
   
   
    private int count;  //channel存储data个数
    @Getter
    private List<Data> list = new ArrayList<Data>();

    public Channel(int count){
   
   
        this.count = count;
    }
    public synchronized void setData(Data data) throws InterruptedException {
   
   
        if(list.size() < count){
   
   
            list.add(data);
            System.out.println(Thread.currentThread().getName() + " 生产了一个数据, 目前数据个数:" 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值