0%

ThreadPoolExecutor是一个ExecutorService,实现了Executor接口,是一个线程池服务的实现。通常通过Executors类的工厂方法来创建。

一、实现原理

1、关键要素

要理解线程池的实现原理,主要理解以下的关键要素:

• 线程池的状态:提供了线程池生命周期中所处的不同状态,分别为以下状态(分别用0,1,2,3表示):
①RUNNING: 可以接收新任务和可以处理队列中的任务;
②SHUTDOWN: 不接收新任务,可以继续处理队列中的任务;
③STOP: 不接收新任务,也不处理队列任务,中断在执行的任务;
④TERMINATE: 类似STOP,所有的线程都会停止。
• 线程数量控制参数:用于控制何时创建线程,何时不能创建线程和任务逻辑控制。
①corePoolSize: 池中核心线程的数量;
②maximunPoolSize: 池中最大的线程数量;
③poolSize: 当前池中的线程数量;
• 工作者线程和工作队列:工作者线程从工作队列中获取任务并执行,如果设置了超时参数,工作者线程如果没有任务时,会被回收。工作队列使用的都是阻塞BlockingQueue。
• 线程工厂:ThreadFactory,用于创建新线程,可以自定义线程的一些属性,比如名称等,如果在初始化是没有配置,就会使用默认的ThreadFactory。
• 保持活动的时间:keepAliveTime,当线程池中有多于corePoolSize的线程时,多出的线程空闲时间超过keepAliveTime时将会被清理。
• 拒绝策略:当线程池已经关闭或线程数量达到最大数或工作队列已经饱和时,将拒绝执行新的任务, 主要实现了以下4种拒绝策略:
①AbortPolicy:中断策略,默认的策略,拒绝任务并抛出运行时异常RejectedExecutionException;
②CallerRunsPolicy:使用调用者线程执行任务,除非线程池已经shutdown。
③DiscardPolicy:不能执行的任务将删除;
④DiscardOldestPolicy:如果执行程序未关闭,位于队列头的任务被删除,然后重试执行程序(失败则重复此过程)。
阅读全文 »

知道了Fork/Join框架的原理后,对阅读源码应该困难小了很多。Fork/Join框架核心的类有3个,ForkJoinTask、ForkJoinWorkerThread和ForkJoinPool,另外还有两上ForkJoinTask的子类,RecursiveTask和RecursiveAction。

一、类图结构

fj4

从类图可以看出,ForkJoinPool是一个ExecutorService服务,ExecutorService的方法都适用于ForkJoinPool,而ForkJoinTask也是一个Future实现类,Future定义的方法在ForkJoinTask中都有实现。ForkJoinWorkerThread则是Thread的子类,是一个特殊的线程实现。RecursiveTask和RecursiveAction则分别继承了ForkJoinTask,RecursiveTask表示有结果的任务,而RecursiveAction则表示没有返回结果的任务,一般在使用时都会继承这两个子类来实现它的compute方法。

二、源码分析

阅读全文 »

fork/join executor框架是jdk7conrrent包中新增的并发编程的一个利器,是Doug Lea的又一力作,fork/join框架的原理发表在论文A Java Fork/Join Framework上。fork/join框架充分了利用了现代处理器多核心的特点,通过work stealing(工作窃取)来达到充分利用CPU的目的。通过fork/join的机制,对大任务进行分割合并来处理复杂海量的计算任务。

在了解fork/join 框架的工作机制之前,需要先了两个关键的概念原理,deque-双端队列,work stealing-工作窃取。

一、Deque(双端队列)

在fork/join框架中,deque是由框架中的ForkJoinWorkerThread类实现的,没有采用阻塞队列LinkedBlockingDeque这个现成的实现类。LinkedBlockingDeque采用的是独占锁对队列两端的操作进行并发控制,一定程度上削弱了它的性能。另外一个原因是ForkJoinWorkerThread作为ForkJoinPool控制的线程,与一般的线程存在区别,ForkJoinWorkerThread中实现deque,可以更好的支持并发。
ForkJoinWorkerThread中的任务队列deque是通过数组来实现的,分别用queueTop和queueBase两个整型的引用指向队列的头和尾。而在行为上,deque又支持FIFO和LIFO两种操作模式。deque的工作模式如下图所示:

fj池

阅读全文 »

最近在玩serverless的FaaS实现,随便kindle上找了本书,作者是刘宇,是个腾讯SCF的开发者,就照着书的demo作了个实践。

腾讯云的SCF是FaaS的实现,使用前先注册腾讯云账号,有微信的话,注册很方便,另外需要把对象存储服务COS也开了。SCF服务和COS服务每月有免费使用的额度,用于测试和玩玩也够了。

先安装SCF命令行客户端工具:

pip install scf

进行配置,scf config,照着提示配置一些key之类的,就可以用的, 可以配置把上传的函数部署时存储到COS上。

阅读全文 »

1