多线程学习——线程池
1.什么是线程池?
线程池通过用队列管理任务统一调度线程的工具
2.线程池的常见参数
corePoolsize
核心线程数
maxPoolsize
最大线程数
keepAlivetime
保持存活时间
workqueue
任务队列
synchronousQueue
直接交换
不会存任务
linkedBolckQueue
无界队列
ArrayBlockQueue
有界队列
threadFactory
线程工厂
Handler
如果线程池无法处理任务 拒绝策略
3.线程池添加线程的规则
如果线程数小于corepoolsize,即使其他线程空闲也会创建新的线程来运行任务
如果线程数等于或大于corepoolsize但小于队列的数,则会将任务放入队列中
如果队列已满,并且线程数小于maxPoolsize,则会创建线的线程数
如果队列已满,线程数大于或等于maxPoolsiez则会拒绝任务
特点:
corePoolsize=maxPoolsize
固定长度线程池
线程池希望保持较小的线程数
maxPoolsize很大
那么会创建很多线程
无界队列
线程数不会超过队列数
4.常见的线程池
1.newFixedThreadPool
定长的线程池
阻塞队列
会造成任务挤压 OOM异常
参数
corePoolsize
传入
maxPoolsize
传入
keepAlivetime
0
2.newSingleThreadPool
阻塞队列
线程数为1
会造成任务挤压 OOM异常
参数
corePoolsize
1
maxPoolsize
1
keepAlivetime
0
3.newCachedThreadPool
直接交换
会回收队列
最大线程数为整形最大值
参数
corePoolsize
0
maxPoolsize
interger.max
keepAlivetime
60
4.newScheduleThreadPool
定时线程
参数
corePoolsize
传入
maxPoolsize
interger.max
keepAlivetime
0
4.workingstealThreadPool(1.8)
该线程池会将任务会发为子任务
5.手动设置线程池参数
线程池的线程数量:
CPU密集的任务(加密运算,计算hash)
最佳线程数为CPU核心的1-2倍
耗时IO型(读取数据库 读取文件 网络读写)
最佳线程会大于CPU核心数的很多倍
6.线程池的停止方法
shutdown
停止接受任务 但是会把任务队列中的任务处理完在停止
isshutdown
标记线程池是否关闭 只有执行了shutdown方法就为true
isTerminated
标记整个线程池是否还在运行 只有完全处理完剩余的任务 才为true
awaitTermination
在一段时间后 查看线程池是否执行完毕
shutdownNow
立即中断
返回队列中的未执行的任务
7.线程池拒绝策略
abortPolicy
将拒绝信息返回
discardPolicy
不返回拒绝信息
discardOldestPolicy
将老的任务丢弃
CallerRunerPolicy
任务由主线程完成
给线程池缓冲下
5.线程池的组成和状态
组成
线程池管理器
队列
工作线程
任务接口
状态
running
shutdown
stop
tidying
terminated