Java线程池执行器

示例

使用的常见执行程序是ThreadPoolExecutor,它负责线程处理。您可以配置执行者在无事可做时必须始终维护的最小线程数(称为核心大小),以及如果有更多工作要做,则池可以增长到的最大线程大小。一旦工作负载减少,池将再次缓慢减少线程数,直到达到最小大小。

ThreadPoolExecutor pool = new ThreadPoolExecutor(
    1,                                     // 至少准备好一个线程, 
                                           // 即使没有执行的Runnable
    5,                                     // 最多五个Runnable /线程
                                           // 并行执行
    1, TimeUnit.MINUTES,                   // 空闲线程在一个之后终止
                                           // 分钟,超过最小池大小
    new ArrayBlockingQueue<Runnable>(10)); // 优秀的Runnables被保存在这里

pool.execute(new Runnable() {
    @Override public void run() {
        //要运行的代码
    }
});

注意:如果ThreadPoolExecutor使用无界队列配置,则线程数将不会超过,corePoolSize因为仅当队列已满时才创建新线程:

带有所有参数的ThreadPoolExecutor:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)

从JavaDoc

如果运行的线程数大于corePoolSize但小于maximumPoolSize,则仅在队列已满时才创建新线程。

优点:

  1. 可以控制BlockingQueue的大小,并且可以避免内存不足的情况。有限的有限队列大小不会降低应用程序性能。

  2. 您可以使用现有策略或创建新的拒绝处理程序策略。

    1. 在默认的ThreadPoolExecutor.AbortPolicy中,处理程序在拒绝时会抛出运行时RejectedExecutionException。

    2. 在中ThreadPoolExecutor.CallerRunsPolicy,调用执行自己的线程运行任务。这提供了一种简单的反馈控制机制,它将降低新任务的提交速度。

    3. 在中ThreadPoolExecutor.DiscardPolicy,简单地删除了无法执行的任务。

    4. 在中ThreadPoolExecutor.DiscardOldestPolicy,如果未关闭执行程序,则将丢弃工作队列开头的任务,然后重试执行(这可能再次失败,从而导致重复执行此操作)。

  3. ThreadFactory可以配置自定义,这很有用:

    1. 设置更具描述性的线程名称

    2. 设置线程守护程序状态

    3. 设置线程优先级

这是如何使用ThreadPoolExecutor的示例