做者:林冠宏 / 指尖下的幽灵java
掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8git
博客:http://www.cnblogs.com/linguanh/github
GitHub : https://github.com/af913337456/并发
本文适合:函数
不适合:spa
经常使用的线程池
的知识相关点废话少说,咱们开始。下图,皆可自行保存,经常阅之。日久,根深蒂固线程
public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler ) {
....
}
复制代码
参数名 | 做用 |
---|---|
corePoolSize | 队列没满时,线程最大并发数 |
maximumPoolSizes | 队列满后线程可以达到的最大并发数 |
keepAliveTime | 空闲线程过多久被回收的时间限制 |
unit | keepAliveTime 的时间单位 |
workQueue | 阻塞的队列类型 |
RejectedExecutionHandler | 超出 maximumPoolSizes + workQueue 时,任务会交给RejectedExecutionHandler来处理 |
corePoolSize,maximumPoolSize,workQueue之间关系。3d
当线程池中线程数小于corePoolSize时,新提交任务将建立一个新线程执行任务,即便此时线程池中存在空闲线程。代理
当线程池中线程数达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行 。code
当workQueue已满,且maximumPoolSize > corePoolSize时,新提交任务会建立新线程执行任务。
当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理。
当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收这些线程。
当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize范围内的线程空闲时间达到keepAliveTime也将回收。
public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(
nThreads, // corePoolSize
nThreads, // maximumPoolSize == corePoolSize
0L, // 空闲时间限制是 0
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>() // 无界阻塞队列
);
}
复制代码
public static ExecutorService newCachedThreadPool(){
return new ThreadPoolExecutor(
0, // corePoolSoze == 0
Integer.MAX_VALUE, // maximumPoolSize 很是大
60L, // 空闲断定是60 秒
TimeUnit.SECONDS,
// 神奇的无存储空间阻塞队列,每一个 put 必需要等待一个 take
new SynchronousQueue<Runnable>()
);
}
复制代码
public static ExecutorService newSingleThreadExecutor() {
return
new FinalizableDelegatedExecutorService
(
new ThreadPoolExecutor
(
1,
1,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory
)
);
}
复制代码
能够看到除了多了个 FinalizableDelegatedExecutorService
代理,其初始化和 newFiexdThreadPool
的 nThreads = 1 的时候是同样的。 区别就在于:
使用ThreadFactory
,能够改变线程的名称、线程组、优先级、守护进程状态,通常采用默认。
流程图略,请参考 newFiexdThreadPool,这里再也不累赘。
还有一个定时任务线程池ScheduledThreadPool
它用来处理延时或定时任务,不经常使用