《java并发编程实践》---第8章 应用线程池
Posted anpeiyong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《java并发编程实践》---第8章 应用线程池相关的知识,希望对你有一定的参考价值。
1、定制线程池的大小
1.1、线程池的合理大小 取决于 未来提交的任务类型 和 所部署的系统特征;
2、配置ThreadPoolExecutor
2.1、ThreadPoolExecutor 提供了 一些基本的Executor的实现:
(由 工具类Executors 提供的newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor、newSingleThreadScheduledExecutor 返回)
2.2、如果 Executors提供的不能满足需求,可以通过ThreadPoolExecutor定制:
核心线程池大小:
即使没有任务执行,池的大小也等于核心池的大小,直到工作队列充满前,都不会增加新的线程;
最大线程数:
池内同时活动的线程的上限;
线程存活时间:
如果一个线程闲置的时间超过了存活时间,并且 池大小 大于 核心线程大小 ,线程池会终止该线程;
工作队列:
ThreadPoolExecutor提供了BolckingQueue 持有等待执行的任务;
任务队列有3种:无限队列、有限队列、同步移交
拒绝策略:
当任务队列满后,新任务怎么处理?
jdk提供了4种饱和策略:
AbortPolicy:
默认策略,抛出RejectedExecutionException异常;
CallerRunsPolicy:
既不会抛出异常、也不会丢弃任务,而是 将任务推回,由调用者执行;
DiscardPolicy:
丢弃新任务;
DiscardOldestPolicy:
丢弃最老的任务
3、扩展ThreadPoolExecutor
3.1、ThreadPoolExecutor提供了几个钩子函数:
beforeExecute()
如果beforeExecute()抛出一个RuntimeException, 任务不会执行,afterExecute()不会执行;
afterExecute()
任务 正常运行、 抛出异常, afterExecute()都会执行;
任务 抛出Error, afterExecute()不会执行;
terminated()
线程池完成关闭后调用;
3.2、应用:
添加日志、时序、监视器、统计信息等;
以上是关于《java并发编程实践》---第8章 应用线程池的主要内容,如果未能解决你的问题,请参考以下文章