线程池的封装和使用(代理模式工厂模式)
通过线程池代理类和线程池工厂完成对线程池操作的解耦。
简单的代理模式和简单的工厂模式
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);
希望能对开源框架的封装有一些启发。
线程池的封装和使用(代理模式工厂模式)相关推荐
- 浅析Nginx中各种锁实现丨Nginx中手写一个线程池丨Nginx中反向代理,正向代理,负载均衡,静态web服务丨C++后端开发
学会nginx中锁的使用,让你对锁豁然开朗 1. 反向代理,正向代理,负载均衡,静态web服务 2. nginx 中 accept 锁实现 自旋锁 信号量 3. nginx 中 线程池 实现以及详解虚 ...
- 二次封装图片第三方框架——简单工厂模式的运用
CSDN首发地址: 前言 写在前头,这篇博客对于老司机们没什么多大的意义,老司机们就不用看了,对于新手还是有很大实用价值的. 平时在项目中,你们有没有遇到这样的情况,比如之前项目是使用开源框架Imag ...
- 如何使用 Spring 实现策略模式+工厂模式
欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...
- 体现SRP(单一职责原则)的两种模式——工厂模式和命令模式
单一职责有两种含义:一是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责.遵循单一职责的目的: (1)可以减少类之间的耦合(模块与模块之间的依赖关系) 减少类之间的耦合,当需求发生变化时 ...
- 策略模式+工厂模式的组合使用
策略模式+工厂模式的组合使用 策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 个人感觉特别好用,当你在一段代码中,有很多的候选算法,你就可以用这个策略模式了,可以有效的取出 ...
- 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。
设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...
- 实践:使用Spring 原生注解来快速实现 策略模式 + 工厂模式
作者:Richard_Yi juejin.im/post/5db0e910518825648f2ef355 前言 这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来, ...
- 设计模式 — 创建型模式 — 工厂模式
目录 文章目录 目录 工厂模式(Factory Pattern) 应用场景 编码示例 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 工厂模式(Factory Pattern) 工厂模式(Fac ...
- 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript
设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...
- 创建型模式 工厂模式
创建型模式 工厂模式 /*** 创建型模式 工厂模式* 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 .* 符合"开放-封闭"原则 通过添加代码的方式,不是通过修改代码的 ...
最新文章
- [librosa]0.8版本后不再支持write_wav
- 关于“Ambiguous match found”
- Mongodb部署记录[3]-主从搭建
- CTFshow 命令执行 web72
- [Java] Spring事务REQUIRES_NEW导致项目没有响应-原因DB maxActive没设置
- 场效应管P-MOS N-MOS
- java的finalize_Java中finalize()方法
- Flash制作空战游戏
- 电脑微信多开方式(两种实现方案, 适合中文路径)(办公, 生活两不误 / 海王必备)
- RS422接线 z-tek RS232 TO RS485/RS422
- Eclipse之各个版本的区别
- [渝粤教育] 中山大学 健康评估 参考 资料
- 机器学习中最常使用的10种数据编码方式
- 数据库系统-实体-联系模型
- css实现点点点效果
- Day06(上)C++继承和派生
- deepin20无法启动图形界面_U盘启动盘暗藏推广?用它来打造安全个性的PE工具箱...
- FutureTask源码解析二
- Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)! To rerun under ARM use: ar
- PP过滤器(螺纹式)操作说明书
热门文章
- php soapclient 异常,PHP调用wsdl接口实例化SoapClient抛出异常
- Oracle Secure Global Desktop 部署考虑事项
- 2018年蓝桥杯省赛B组C++真题
- 2022中国眼博会,山东视力防控展会,近视镜,中国近视矫正展
- 刚刚获得软银中国2.2亿人民币B轮投资的码隆科技,到底是一家怎样的公司?
- 单片机机器周期怎么计算公式_单片机指令周期怎么计算
- uniApp获取用户位置信息两种方法
- 法国高等计算机工程学院,法国高等专业学院介绍
- 线性表的顺序表示01
- 【2022年度悲报】-回望2022,展望2023