Java 并发线程池

106 阅读2分钟

线程池好处

  • 降低资源消耗
  • 提高响应速度
  • 提供线程的可管理性
  • 提供更多更强大的功能

线程池核心参数

ThreadPoolExecutor(int corePoolSize,
                   int maximumPoolSize,
                   long keepAliveTime,
                   TimeUnit unit,
                   BlockingQueue<Runnable> workQueue,
                   ThreadFactory threadFactory,
                   RejectedExecutionHandler handler)
参数描述
corePoolSize核心线程数
maximumPoolSize最大线程数
workQueue任务的队列
keepAliveTime线程空闲时间
unitkeepAliveTime 参数的时间单位
threadFactory执行程序创建新线程时使用的工厂
handler超出工作队列和线程池时,任务会默认抛出异常

线程池拒绝策略

拒绝策略描述
AbortPolicy默认拒绝策略,丢弃任务,抛出RejectedExecutionException
DiscardPolicy丢弃任务,不抛异常
DiscardOldestPolicy丢弃任务队列最早的任务,重新提交当前任务
CallerRunsPolicy只要线程池没有被关闭,那么由提交任务的线程自己来执行这个任务

线程池任务队列

任务队列描述
ArrayBlockingQueue基于数组结构的有界阻塞队列,按 FIFO(先进先出)原则对元素进行排序
LinkedBlockingQueue基于链表结构的阻塞队列,按FIFO 排序元素,吞吐量通常高于ArrayBlockingQueue
SynchronousQueue不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue
PriorityBlockingQueue具有优先级得无限阻塞队列

Exterors常用线程池

线程池描述
newSingleThreadExecutor单线程的线程池,按照任务的提交顺序执行
newFixedThreadPool固定大小的线程池
newCachedThreadPool可缓存的线程池
newScheduledThreadPool大小无限的线程池

线程池任务提交

提交方式描述
execute提交不需要返回值的任务,无法判断任务是否执行成功
submit提交需要返回值得任务,会返回一个future类型的对象,可以判断这个任务是否执行成功

ThreadPoolExecutor运行状态

运行状态描述
RUNNING能接受新提交任务,也能处理阻塞队列中的任务
SHUTDOWN关闭状态,不再接受新提交任务,但能继续处理阻塞队列中已保存的任务
STOP不接受新任务,也不处理队列中的任务,会中断正在处理任务的线程
TIDYING所有任务都已终止,workerCount(有效线程数)为0
TERMINATED在terminated()方法执行完进入该状态

线程池处理流程

image.png

参考资料: tech.meituan.com/2020/04/02/…