目录
0、背景
最近看到很多开源框架关于线程池的封装,就想将这些对线程池的封装进行总结一下,然后,突然有一种感觉,我是自己在重复造轮子,虽然最终实现的基本原理一致,但是实现不够优雅,所以我们从来不缺少创造的能力,在自己知识面宽度不够的情况下,多读读开源框架的源码,对我们会有很大的启发。
1、JDK的线程池
1.1 Executors 线程池工具类
主要提供了创建线程池的工厂方法,方便了我们创建线程池。
1.2 ThreadPoolExecutor 线程池实现
ThreadPoolExecutor是JDK提供的线程池实现类
2、Guaval对ThreadPoolExecutor封装
我觉得Guava对线程池最大贡献的两个类是MoreExecutors和ListenableFuture
2.1MoreExecutors
MoreExecutors可以对ExecutorService进行装饰提供一些增强的功能
2.2ListenableFuture
ListenableFuture可以对Future进行扩展,提供一些增强的功能,可以增加任务执行之后的回调
3、Hutool对ThreadPoolExecutor封装
Hutool进行的封装主要是提供了线程池的建造者ExecutorBuilder,方便开发人员按照自己的需求来创建线程池;此外,他提供了一个合理的TheadUtil外观,更方便我们来使用其对线程池的功能使用。
3.1ExecutorBuilder源码
3.2ThreadUtil源码
3.3ConcurrencyTester源码
package cn.hutool.core.thread;
import cn.hutool.core.date.TimeInterval;
/**
* 高并发测试工具类
*
* <pre>
* ps:
* //模拟1000个线程并发
* ConcurrencyTester ct = new ConcurrencyTester(1000);
* ct.test(() -> {
* // 需要并发测试的业务代码
* });
* </pre>
*
* @author kwer
*/
public class ConcurrencyTester {
private final SyncFinisher sf;
private final TimeInterval timeInterval;
private long interval;
/**
* 构造
* @param threadSize 线程数
*/
public ConcurrencyTester(int threadSize) {
this.sf = new SyncFinisher(threadSize);
this.timeInterval = new TimeInterval();
}
/**
* 执行测试
*
* @param runnable 要测试的内容
* @return this
*/
public ConcurrencyTester test(Runnable runnable) {
timeInterval.start();
this.sf//
.addRepeatWorker(runnable)//
.setBeginAtSameTime(true)// 同时开始
.start();
this.interval = timeInterval.interval();
return this;
}
/**
* 获取执行时间
*
* @return 执行时间,单位毫秒
*/
public long getInterval() {
return this.interval;
}
}
4、Spring对ThreadPoolExecutor封装
4.1ThreadPoolTaskExecutor源码
ThreadPoolTaskExecutor是Spring提供了一个线程池支持类,方便我们将其实例化交给Spring容器管理
4.2ListenableFuture源码
ListenableFuture参考了Guava中的ListenableFuture,可以实现对Futrue的回调,Spring的工程师果然更强,其封装之后,更优雅。
4.3TaskDecorator源码
TaskDecorator可以对任务进行装饰,特别是需要从MDC和ThreadLocal中传递线程上下文参数时,提供了一种非常好的扩展机制。
5、我对ThreadPoolExecutor封装
这是我自己重复造的轮子,参考文章:可监控的线程池的工程实践