线程池
2018-07-15 本文已影响0人
Mwp的救赎
线程池ThreadPoolExecutor
几个重要角色
- Thread 线程;
- ThreadFactory 线程工厂,创建Thread;
- Worker,Thread真正运行的Runnable;
- BlockingQueue,阻塞队列,当核心线程数无空闲时,用户任务入队等待;
-
RejectedExecutionHandler 当等待队列已满且线程池无空闲时,由RejectedExecutionHandler来处理拒绝流程。
以上角色关系示例图如下: threads_pool.png
用户任务(Runnable)被线程池执行(execute)的流程: worker.png
工具类Executors
- newSingleThreadExecutor
corePoolSize=maximumPoolSize=1的线程池 - newFixedThreadPool
corePoolSize=maximumPoolSize=n(n>=1)的线程池
注:newSingleThreadExecutor()≠newFixedThreadPool(1),因为通过newFixedThreadPool(1)创建的线程池可以重新设置并发线程数,而newSingleThreadExecutor()创建出来的线程池无法改变并发线程数,只能是单线程。
-
newCachedThreadPool
核心线程数0,最大线程数Integer.MAX_VALUE,线程保活时间60秒的线程池。官方注释其适用于大量short-lived任务。
下图说明其工作机制(假设用户任务耗时30秒):
1.用户于00:00、00:15提交两个30秒的任务,两个Worker并发执行:
CachedThreadPool1.png
-
00:30之后,Worker1空闲,用户于00:40 提交任务Task3,交由Worker1执行
CachedThreadPool2.png -
00:45-01:45没有新任务进入,Worker2等待超时,线程终止:
CachedThreadPool3.png -
01:50、02:00用户依次提交两个任务Task4、Task5,Worker1仍存活,执行Task4,由于Worker2终止,新建Worker3执行Task5:
CachedThreadPool4.png