Java线程之Producer-Consumer Pattern

本文介绍了生产者-消费者模式中的关键角色及其职责,包括生产者、消费者、数据及通道参与者。阐述了通道如何实现线程间的互斥访问,确保数据的安全传递。此外,还讨论了不同数据传递机制如队列、堆栈和优先队列。

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

 Producer-Consumer Pattern的参与者:

1. Data参与者

    被Producer参与者所创建,并由Consumer参与者所使用。

 

2. Producer(生产者)参与者

    创建Data参与者,并将其传递给Channel参与者。

 

3. Consumer(消费者)参与者

    从Channel参与者获取Data参与者。

 

4. Channel(通道)参与者

    Channel参与者从Producer参与者处接收Data参与者,并将其保管起来。并应Consumer参与者的要求,将Data参与者传送出去。

    为了确保安全性,Producer参与者与Consumer参与者要对访问进行共享排斥。

 

在Producer-Consumer Pattern中,肩负保护安全性使命的是Channel参与者。Channel参与者进行线程之间的共享互斥,让Producer参与者能够正确的将Data参与者送到Consumer参与者手上。

 

这里,虽然分离了Producer和Consumer之间的交互,Producer参与者不需要等Consumer参与者处理完Data,就可以继续去制造下一个Data,Channel参与者作为Producer和Consumer之间的缓冲区。但是Channel参与者的容量也是有限的,也就是说,当Consumer消费Data的速度小于Producer制造Data的速度时,Channel中的Data数量会持续增加。这里需要对Channel的容量加以控制,否则可能会最后因为内存不足而使得Producer制造不出Data。对于Producer参与者来说,在Channel容量不足的情况下,要予以等待。

 

 

引申:

1. 因为Channel参与者的中介,使得Producer和Consumer的多条线程协调合作。

    线程为了协调合作,所以必须进行共享互斥,使共享的东西不被损坏。而线程的共享互斥,就是为了让相处合作才进行的。

    线程的合作要想“放在中间的东西”,线程的互斥要想“应该保护的东西”

 

2. 因为Channel参与者的中介,可以使Producer制造出来的多个Data以不同的顺序传递给Consumer。

    常见的传递机制有:

    -- 队列, 最先收到的先传

    -- 堆栈, 最后收到的先传

    -- 优先队列, “优先”的东西先传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值