ThreadPoolExecutor
原始的,配置可能最多的线程池。如果正在运行的线程等于corePoolSize时,ThreadPoolExecutor优先往队列中添加任务,直到队列满了,并且没有空闲线程时才创建新的线程
可调整参数:corePoolSize保证存在的线程数量,maximumPoolSize最大池中线程数量,keepAliveTime & unit线程存活时间及单位,当线程数量超过最大数量时,超过存活时间的线程将被终止。
实现:
新任务到来时,
1)当前线程数小于corePoolSize时,直接新建线程执行。如果失败,进入3
2)大于等于corePoolSize时,如果能放入队列,则放入队列中,如果队列已满,进入3
3)当前线程数小于maximumPoolSize时,创建一个新的线程
newCachedThreadPool
根据需要动态新增线程,如果已存在可用的线程,则重复使用之。超过60秒未使用的线程将被终止移除
应用场景:并发执行大量短存活周期的异步任务。
实现:corePoolSize=0,maximunPoolSize=Integer.MAX_VALUE,超时时间60秒,同步队列(synchronousQueue)
newFixedThreadPool
固定数量线程,共享无界队列。如果一个线程异常退出,将新建一个线程执行后续任务。除非显式关闭(call shutdown),否则线程会一直存在。
应用场景:稳定数量的长存货周期任务。
可调整参数:线程数量
实现:corePoolSize=maximumPoolSize,没有超时时间,链式阻塞队列。
newSingleThreadExecutor
单个线程,无界队列。线程异常退出时将新建线程继续执行任务。该执行器不能重新配置以支持多个线程。不保证线程的执行顺序
应用场景:会产生子任务的异步任务(不能同步,因为不保证执行顺序)
实现:corePoolSize=maximumPoolSize=1,其他等同于newFixedThreadPool
newWorkStealingPool
创建和当前机器可用处理器个数等量的线程数。实际运行的线程数会动态变化。
可调整参数:并发数。不设置即默认当前机器可用处理器个数。
实现:ForkJoinPool