# 《并发设计模式》第34章-主动对象模式-主动对象模式在线程池中的应用

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:初步了解主动模式的应用场景,重点理解主动对象的核心原理与在线程池中的应用,并能够结合自身项目实际场景思考如何将主动对象模式灵活应用到自身实际项目中。

大家好,我是冰河~~

在基于主动对象模式优化社区电商系统案例代码时,使用到了线程池,细心的小伙伴可能会问:那线程池里是不是就使用了主动对象模式呢?恭喜你,你都可以独立思考问题了,答案是:没错,在线程池的实现中,确实使用到了主动对象模式。

# 一、故事背景

小菜在老王耐心的指导下,不仅又学会了主动对象模式,还基于主动对象模式优化了社区电商系统的代码,使得发布商品时,长链接转换成短链接的功能更加稳定和可靠。小菜发现,其实在基于主动对象模式优化社区电商系统代码时,还是使用到了线程池,难道线程池的设计也使用了主动对象模式?于是,小菜带着这个疑问,开始研究线程池的源码。

# 二、对比分析线程池

我们结合上一章实现的主动对象模式的代码案例执行流程和线程池代码的执行流程来对比下,线程池是否应用了主动对象模式。首先,来看代码案例的执行流程,如图34-1所示。


上图中的代码案例执行流程,是站在运营或者商家角度,发布商品的业务执行流程。对于运营或者商家端来说,将长链接转换成短链接,存储长短链接的映射关系,一般都会部署成单独的服务,发布商品时,如果转换短链接或者存储长短链接的映射关系失败,就会将请求的信息存储起来,当转换长短链接的服务或者存储长短链接映射关系的服务恢复后,再由转换长短链接的服务读取存储的请求信息,将长链接转换成短链接后,将其映射关系存储起来。

在主动对象模式中,会涉及到六大组件,分别为Proxy、Future、MethodRequest、ActivationQueue、Scheduler和Servant。并且优化社区电商系统代码时,我们实现的主动对象模式中的部分组件就直接使用了JDK中的类库实现,分别如下所示。

  • 主动对象模式中的Future使用了JDK中的java.util.concurrent.Future实现。
  • 主动对象模式中的MethodRequest使用了JDK中的java.util.concurrent.Callable实现。
  • 主动对象模式中的ActivationQueue使用了JDK中的java.util.concurrent.ArrayBlockingQueue实现。
  • 主动对象模式中的Scheduler使用了JDK中的java.util.concurrent.ThreadPoolExecutor实现。

说到这里,大家有没有发现一个铁一般的事实:JDK中的Future接口、Callable接口、ArrayBlockingQueue类(其实就是BlockingQueue接口)和ThreadPoolExecutor类,不就是线程池的重要组成部分吗?看到这里,大家是不是有一种豁然开朗的感觉呢?

# 三、温顾线程池流程

我们再来看看线程池的执行流程,如图34-2所示。


可以看到,当向线程池中提交任务时,线程池执行任务的流程如下所示。

# 查看全文

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码