线程池
2020-04-17 本文已影响0人
爺珍爱那颗心
- 今天没做些什么,一直在看视频学习,所以没能出学习文章。
-
什么是线程池
- 把线程进行池化,调用的时候直接去池里面去取,而不是每次去重新创建,不用的时候放回线程池,而不是直接销毁,从而达到复用。
为什么使用线程池
- ①复用线程,降低创建以及销毁导致的资源消耗。
- ②提高响应速度。
- ③提高线程的可管理性,提升系统稳定性。
ThreadPoolExecutor
JDK提供的线程池
ThreadPoolExecutor的构造方法有七个参数
- int corePoolSize
核心线程数
- int maximumPoolSize
约定的线程最大数量
- long keepAliveTime
线程空闲的时候存活多久(但会保留核心线程数的线程数量)
- TimeUnit unit
时间单位
- BlockingQueue<Runnable>workQueue
线程超过核心线程数的部分放到阻塞队列中
- ThreadFactory threadFactory
线程工厂主要是给线程命名
- RejectedExecutionHandler handler
拒绝策略
缺省策略
RejectedExecutionHandler是一个接口,JDK提供了四种实现,如果都不合适,可以自己实现这个接口去处理。
- DiscardOldestPolicy
最早放入的先丢弃
- AbortPolicy
直接抛出异常,也是默认的策略
- CallerRunsPolicy
谁提交的谁执行
- DiscardPolicy
直接丢弃
合理配置线程池
任务的特性有关
- CPU密集型 (大量计算型任务)不要超过机器上CPU同时运行的线程个数
- IO密集型 (文件读写)2*CPU的个数(常见配置)
- 混合型 尽量进行拆分