线程进阶:生产者消费者模式和线程池

本文深入探讨了Java中的生产者消费者模式,通过阻塞队列实现解耦并提高并发性能,举例说明了其工作原理。接着介绍了线程池的重要性和作用,分析了ExecutorService和Executors工具类的使用,并详细讲解了ThreadPoolExecutor线程池的配置与优化。
摘要由CSDN通过智能技术生成

一、生产者消费者模式

这是一种不属于GOF23的设计者模式

这种模式分为三个对象:一个生产者,一个消费者,一个缓存区。

  • 生产者

某些程序/进程/线程负责生产数据就属于生产者

  • 消费者

某些程序/进程/线程负责使用数据就属于消费者

假设在生产者和消费者之间没有一个缓存区,那么会出现什么情况呢?

  1. 耦合性高,生产者和消费者联系紧密,不利于系统的扩展和维护
  2. 并发性能低,同时能处理请求量少
  3. 忙闲不均,生产者和消费者的速度不一致,带来系统资源的浪费

那么如果有一个缓存区,那么两者之间的依赖性就大大降低,也就是解耦。同时生产者也可以生产多个资源放到缓存区,消费者也可以从缓存区多次得到资源,提高并发性能。阻塞队列可以很好的解决忙闲不均的问题。

阻塞队列

能够根据数据满或空的情况,自动对线程执行等待和通知

BlockingQueue 接口

  • put 添加数据,达到上限会自动让线程等待

  • take 取并删除数据,数据空了会自动让线程等待

实现类

ArrayBlockingQueue 类 数据结构为数组

LinkedBlockingQueue类 链表结构

我们这里举一个简单的例子解释一下这个模式:

比方说,早上我们都要去买包子吃早饭,那么包子师傅就是生产者,顾客就是消费者,蒸笼就是缓存区。大家都知道,蒸笼是可以由包子师傅自己决定有多少个,因此缓存区的最大值就可以自己进行设置。包子师傅(生产者)可以一次做多个包子(资源)放到蒸笼(缓存区)里,当有顾客(消费者)来购买包子(拿资源)就是从蒸笼里面拿取包子。蒸笼满了,包子师傅就不会做包子了,顾客也会来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值