作者:林冠宏 / 指尖下的幽灵
腾讯云+社区:https://cloud.tencent.com/developer/user/1148436/activities
掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8
博客:http://www.cnblogs.com/linguanh/
GitHub : https://github.com/af913337456/
本文适合:
不适合:
常用的线程池
的知识相关点废话少说,我们开始。下图,皆可自行保存,常常阅之。日久,根深蒂固
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之间关系。
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
它用来处理延时或定时任务,不常用
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句