前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >盘点java线程池中的设计模式

盘点java线程池中的设计模式

作者头像
简单的程序员
发布2021-01-12 10:44:17
1.7K0
发布2021-01-12 10:44:17
举报
文章被收录于专栏:奕仁专栏奕仁专栏

说起线程池,大家可能都比较熟悉,但是里面的源码又知多少呢? 不慌,五哥带你去翻翻源码

本篇文章会对线程池的源码进行跳跃式的代码和分析,不清楚的可以翻到源码位置并对照文章进行对比:

策略模式

在新创建一个线程池的时候,会在构造方法传入一个拒绝的策略,jdk内部封装了几个常用的拒绝策略,并抽象了拒绝策略的接口,供开发者去实现。

以下源码位置均在jdk的TheadPoolExecutor类

拒绝类

拒绝实现

位置

AbortPolicy

抛出异常

2047行

DiscardPolicy

不去处理

2071行

DiscardOldestPolicy

执行任务

2107行

CallerRunsPolicy

同步执行(main线程)

2023行

当然用户还可以手动去实现RejectedExecutionHandler 开发自己的拒绝策略

装饰器模式

在使用到Executors类的时候,用到了newSingleThreadExecutor方法

代码语言:javascript
复制
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
    return new FinalizableDelegatedExecutorService (new 
    ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS, new 
   LinkedBlockingQueue<Runnable>(), threadFactory));
 }

在这里,jdk在创建单个线程池的时候用到了装饰器模式,原因是因为如果用ThreadPoolExecutor类,则用户可以手动修改核心线程的个数,这样就违背了单线程池的初衷,因此将ThreadPoolExecutor类装饰起来,取消掉setCoreSize等方法,仅暴露出AbstractExecutorService提供的抽象方法实现

代码语言:javascript
复制
 static class DelegatedExecutorService extends AbstractExecutorService {
        private final ExecutorService e;
//间接调用该实现 为了屏蔽setXXX方法
        DelegatedExecutorService(ExecutorService executor) { e = executor; }
//...
        public void execute(Runnable command) { e.execute(command); }
        }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 策略模式
  • 装饰器模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档