ThreadPoolExecutor

一个 ExecutorService ,它使用服务池中的线程执行每一次提交的任务,通常使用 Executors 的工厂方法配置它 。

线程池解决两个不同的问题:当执行大数量的异步任务的时候它通常具有更高的性能,因为它减少了调用每一个任务的开销;同时它提供了绑定和管理资源(包括执行任务集合时使用的线程)的手段。 每一个 ThreadPoolExecutor 也维护了基本的统计数据,例如已完成的任务数量。

为了能贯穿大量的上下文来使用,奔雷提供了许多课调整的参数和可扩展的钩子。 开发人员能更方便的使用 Executors 工厂方法:

  • Executors.newCachedThreadPool()(未绑定线程,线程会被自动创建)

  • Executors.newFixedThreadPool(int)(修正线程池中的线程数量)

  • Executors.newSingleThreadExecutor()(单一的后台线程)

    这些预配置设置是为最常见的使用场景提供的。

    其他的情况下根据下文的指导手动配置和调节类:

核心和最大线程数

ThreadPoolExecutor 将根据 coerPoolSize 和 maximumPoolSize 两个值自动调整线程数目(请看 getPoolSize())。 当一个新的任务通过 execute 被提交,小于 corePoolSize 数目的线程将会运行,一个新的线程被创建用于持有这个请求,即使存在其他闲置的工作线程 。 如果正在运行的线程数超过了 corePoolSize 但是少于 maximumPoolSize ,只有队列是满的时候才会创建一个新线程。 通过将 corePoolSize 和 maximumPoolSize 设置为相同的值,你能创建一个修正数量的线程池。 通过设置 maximumPoolSize 为一个无边界的值(例如 Integer.MAX_VALUE),你能允许线程池容纳任意数量的并发任务。 多数情况下,核心和最大池数字在使用的时候才会设置,他们可以通过 setCorePoolSize(int)setMaximumPoolSize(int) 进行设置 。

按需构造

默认的,只有当新任务到达的时候才会有一个核心线程被创建和初始化,但是这些动作可以通过 prestartCoreThread()prestartAllCoreThreads() 动态覆盖。 如果你通过一个飞空队列构造一个线程池,你或许希望预先启动线程。

创建新线程

新线程通过 ThreadFactory 创建。 如果没有重写

Last updated