Java线程池

来源:互联网 发布:2017程序员就业形势 编辑:程序博客网 时间:2024/06/04 20:00

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

0 0
原创粉丝点击