线程池的优点:
线程复用节省开销,从而加快响应速度
方便管理(如控制最大并发数)
核心:三大方法,七大参数,四种拒绝策略
三大方法
1 | ExecutorService threadPool= |
七大参数
1 | public static ExecutorService newSingleThreadExecutor() { |
以银行取钱的例子说明七大参数
如果阻塞队列(等候区)满了,则增加
poolSize
,直到maximumPoolSize
如果仍满,则触发拒绝策略
RejectedExucutionHandler
如果增开的线程区(
core ~ max
)在keepAliveTime
内没有业务,则关闭,释放资源
.
最大承载线程数 = 最大线程数 + 阻塞队列大小
阿里巴巴开发手册
.
四种拒绝策略
1 | new ThreadPoolExecutor.AbortPolicy()//默认策略, 抛出 RejectedExecutionException 异常 |
CPU密集型 & IO密集型
最大线程数到底该如何定义?这和调优相关
CPU密集型
最大线程数 = CPU核数(Runtime.getRuntime().availableProcessors()
),使CPU效率拉满
IO密集型
最大线程数 > 程序中十分耗IO的线程数