通过线程池代理类和线程池工厂完成对线程池操作的解耦。
简单的代理模式和简单的工厂模式

1.创建一个代理类

public class ThreadPoolProxy {ThreadPoolExecutor  mExecutor;          // 只需创建一次int                 mCorePoolSize;int                 mMaximumPoolSize;long                mKeepAliveTime;public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {super();mCorePoolSize = corePoolSize;mMaximumPoolSize = maximumPoolSize;mKeepAliveTime = keepAliveTime;}private ThreadPoolExecutor initThreadPoolExecutor() {//双重检查加锁if (mExecutor == null) {synchronized (ThreadPoolProxy.class) {if (mExecutor == null) {TimeUnit unit = TimeUnit.MILLISECONDS;BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();// 无界队列ThreadFactory threadFactory = Executors.defaultThreadFactory();RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();// 丢弃任务并抛出RejectedExecutionException异常。mExecutor = new ThreadPoolExecutor(//mCorePoolSize,// 核心的线程数mMaximumPoolSize,// 最大的线程数mKeepAliveTime, // 保持时间unit, // 保持时间对应的单位workQueue,// 缓存队列/阻塞队列threadFactory, // 线程工厂handler// 异常捕获器);}}}return mExecutor;}/**执行任务*/public void execute(Runnable task) {initThreadPoolExecutor();mExecutor.execute(task);}/**提交任务*/public Future<?> submit(Runnable task) {initThreadPoolExecutor();return mExecutor.submit(task);}/**移除任务*/public void removeTask(Runnable task) {initThreadPoolExecutor();mExecutor.remove(task);}
}

代理类将线程池单例化。并提供了几个核心的操作方法。属于将线程池构建的放法进行抽取。
2.创建工厂类

public class ThreadPoolFactory {static ThreadPoolProxy  mNormalPool;static ThreadPoolProxy  mDownLoadPool;/**得到一个普通的线程池*/public static ThreadPoolProxy getNormalPool() {if (mNormalPool == null) {synchronized (ThreadPoolProxy.class) {if (mNormalPool == null) {mNormalPool = new ThreadPoolProxy(5, 5, 3000);}}}return mNormalPool;}/**得到一个下载的线程池*/public static ThreadPoolProxy getDownLoadPool() {if (mDownLoadPool == null) {synchronized (ThreadPoolProxy.class) {if (mDownLoadPool == null) {mDownLoadPool = new ThreadPoolProxy(3, 3, 3000);}}}return mDownLoadPool;}
}

3.使用

ThreadPoolFactory.getDownLoadPool().execute(task);

希望能对开源框架的封装有一些启发。

线程池的封装和使用(代理模式工厂模式)相关推荐

  1. 浅析Nginx中各种锁实现丨Nginx中手写一个线程池丨Nginx中反向代理,正向代理,负载均衡,静态web服务丨C++后端开发

    学会nginx中锁的使用,让你对锁豁然开朗 1. 反向代理,正向代理,负载均衡,静态web服务 2. nginx 中 accept 锁实现 自旋锁 信号量 3. nginx 中 线程池 实现以及详解虚 ...

  2. 二次封装图片第三方框架——简单工厂模式的运用

    CSDN首发地址: 前言 写在前头,这篇博客对于老司机们没什么多大的意义,老司机们就不用看了,对于新手还是有很大实用价值的. 平时在项目中,你们有没有遇到这样的情况,比如之前项目是使用开源框架Imag ...

  3. 如何使用 Spring 实现策略模式+工厂模式

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...

  4. 体现SRP(单一职责原则)的两种模式——工厂模式和命令模式

    单一职责有两种含义:一是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责.遵循单一职责的目的: (1)可以减少类之间的耦合(模块与模块之间的依赖关系) 减少类之间的耦合,当需求发生变化时 ...

  5. 策略模式+工厂模式的组合使用

    策略模式+工厂模式的组合使用 策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 个人感觉特别好用,当你在一段代码中,有很多的候选算法,你就可以用这个策略模式了,可以有效的取出 ...

  6. 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。

    设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...

  7. 实践:使用Spring 原生注解来快速实现 策略模式 + 工厂模式

    作者:Richard_Yi juejin.im/post/5db0e910518825648f2ef355 前言 这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来, ...

  8. 设计模式 — 创建型模式 — 工厂模式

    目录 文章目录 目录 工厂模式(Factory Pattern) 应用场景 编码示例 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 工厂模式(Factory Pattern) 工厂模式(Fac ...

  9. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

  10. 创建型模式 工厂模式

    创建型模式 工厂模式 /*** 创建型模式 工厂模式* 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 .* 符合"开放-封闭"原则 通过添加代码的方式,不是通过修改代码的 ...

最新文章

  1. [librosa]0.8版本后不再支持write_wav
  2. 关于“Ambiguous match found”
  3. Mongodb部署记录[3]-主从搭建
  4. CTFshow 命令执行 web72
  5. [Java] Spring事务REQUIRES_NEW导致项目没有响应-原因DB maxActive没设置
  6. 场效应管P-MOS N-MOS
  7. java的finalize_Java中finalize()方法
  8. Flash制作空战游戏
  9. 电脑微信多开方式(两种实现方案, 适合中文路径)(办公, 生活两不误 / 海王必备)
  10. RS422接线 z-tek RS232 TO RS485/RS422
  11. Eclipse之各个版本的区别
  12. [渝粤教育] 中山大学 健康评估 参考 资料
  13. 机器学习中最常使用的10种数据编码方式
  14. 数据库系统-实体-联系模型
  15. css实现点点点效果
  16. Day06(上)C++继承和派生
  17. deepin20无法启动图形界面_U盘启动盘暗藏推广?用它来打造安全个性的PE工具箱...
  18. FutureTask源码解析二
  19. Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)! To rerun under ARM use: ar
  20. PP过滤器(螺纹式)操作说明书

热门文章

  1. php soapclient 异常,PHP调用wsdl接口实例化SoapClient抛出异常
  2. Oracle Secure Global Desktop 部署考虑事项
  3. 2018年蓝桥杯省赛B组C++真题
  4. 2022中国眼博会,山东视力防控展会,近视镜,中国近视矫正展
  5. 刚刚获得软银中国2.2亿人民币B轮投资的码隆科技,到底是一家怎样的公司?
  6. 单片机机器周期怎么计算公式_单片机指令周期怎么计算
  7. uniApp获取用户位置信息两种方法
  8. 法国高等计算机工程学院,法国高等专业学院介绍
  9. 线性表的顺序表示01
  10. 【2022年度悲报】-回望2022,展望2023