文档章节

ThreadPoolExecutor的配置(一)

秋风醉了
 秋风醉了
发布于 2016/03/26 15:31
字数 877
阅读 220
收藏 0

首先来看一下该类的继承结构

 

ThreadPoolExecutor 的配置

他是继承于AbstractExecutorService,是一个默认线程池的实现。以下是包含所有可设置参数的构造函数,

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
    if (corePoolSize < 0 ||
        maximumPoolSize <= 0 ||
        maximumPoolSize < corePoolSize ||
        keepAliveTime < 0)
        throw new IllegalArgumentException();
    if (workQueue == null || threadFactory == null || handler == null)
        throw new NullPointerException();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}

构造函数的参数解释:

参数名 作用
corePoolSize

线程池的核心线程数,默认情况下, 核心线程会在线程池中一直存活, 即使处于闲置状态. 但如果将allowCoreThreadTimeOut设置为true的话, 那么核心线程也会有超时机制, 在keepAliveTime设置的时间过后, 核心线程也会被终止

maximumPoolSize

最大的线程数, 包括核心线程, 也包括非核心线程, 在线程数达到这个值后,新来的任务将会被阻塞

keepAliveTime

超时的时间, 闲置的非核心线程超过这个时长,将会被销毁回收, 当allowCoreThreadTimeOut为true时,这个值也作用于核心线程

TimeUnit keepAliveTime时间单位
BlockingQueue(阻塞队列)

the queue to use for holding tasks before they are executed.  This queue will hold only the {Runnable}

tasks submitted by the {execute} method

ThreadFactory 线程工厂
RejectedExecutionHandler

任务无法执行时,回调handler的rejectedExecution方法来通知调用者

 

Executors提供的线程池配置方案 

在线程池中执行任务比为每一个任务分配一个线程优势更多。通过重用现有的线程而不是创建新线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。也不会由于等待创建线程而延迟任务的执行,从而提高了响应性。

可以通过调用Executors中的静态工厂方法之一来创建一个线程池

  • newFixedThreadPool

  • newCachedThreadPool

  • newSingleThreadExecutor

  • newSingleThreadScheduledExecutor

  • newScheduledThreadPool

/**
 * 创建一个固定长度的线程池,每当提交一个任务时就创建一个线程,直到达到线程池的最大数量,这时线程池的规模将不再变化
 */
public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
            0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>());
}

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
    return new ThreadPoolExecutor(nThreads, nThreads,
            0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>(),
            threadFactory);
}

/**
 * 将创建一个可缓存的线程池,如果线程池的当前规模超过了处理需求时,那么将回收空闲的线程,而当需求增加时,则可以添加新的线程,线程池的规模不存在任何限制
 * @return the newly created thread pool
 */
public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
            60L, TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>());
}

public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
            60L, TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>(),
            threadFactory);
}

/**
 * 是一个单线程的Executor,它创建单个工作者线程来执行任务,如果这个线程异常结束,会创建另一个线程来代替。
 * 能确保依照任务在队列中的顺序来串行执行。
 */
public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                    0L, TimeUnit.MILLISECONDS,
                    new LinkedBlockingQueue<Runnable>()));
}

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
    return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
}

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
    return new ScheduledThreadPoolExecutor(corePoolSize);
}

/**
 * 创建一个固定长度的线程池,而且以延迟或定时的方式来执行任务
 */
public static ScheduledExecutorService newScheduledThreadPool(
        int corePoolSize, ThreadFactory threadFactory) {
    return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}

=============END=============

© 著作权归作者所有

上一篇: Redis数据结构
秋风醉了
粉丝 252
博文 532
码字总数 405694
作品 0
朝阳
程序员
私信 提问
Java多线程之线程池(ThreadPoolExecutor)实现原理分析(一)

在上一篇文章Java中实现多线程的3种方法介绍和比较中,我们讲解了Java中实现多线程的3种方法。使用多线程,就必须要考虑使用线程池,今天我们来聊聊线程池的那些事。 注:源码都是基于JDK1....

小怪聊职场
2018/05/14
0
0
并发编程之Executors(五)

前言: 有了之前的ThreadPoolExecutor基础,本篇分析Executors就非常容易了。本文只讨论Executors类的几个创建线程池的方法,并对Fix和Single区别做了着重分析。 Executors类: 该类用于生成...

后厂村老司机
2018/05/25
0
0
线程池之ThreadPoolExecutor使用

ThreadPoolExecutor提供了四个构造方法: 我们以最后一个构造方法(参数最多的那个),对其参数进行解释: 如果对这些参数作用有疑惑的请看 ThreadPoolExecutor概述。 知道了各个参数的作用后...

天王盖地虎626
06/24
76
0
Spring中ThreadPoolTaskExecutor的线程调度及问题

问题现象 原因分析 任务调度逻辑 汇总分析 解决方案 问题现象 在我们的系统中,使用了这样的配置来开启异步操作: spring配置 客户端开启异步代码 获取Future后的处理 然而在这种配置下,客户...

winters1224
2016/12/23
0
0
我理解的Java并发基础(七):线程池和Executors工具类

线程池,顾名思义就是很多线程对象组成的一个组,对外提供执行任务的服务。调用者不必要关心线程的管理方面的细节。在程序中使用线程池的好处:1,减少内存消耗。每一个线程对象对应操作系统...

康斯但丁
2018/04/15
560
0

没有更多内容

加载失败,请刷新页面

加载更多

32位与64位Linux系统下各类型长度对比

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。 1. 32 位和 64 位C数据类型...

mskk
17分钟前
5
0
Vue 实现点击空白处隐藏某节点(三种方式:指令、普通、遮罩)

在项目中往往会有这样的需求: 弹出框(或Popover)在 show 后,点击空白处可以将其 hide。 针对此需求,整理了三种实现方式,大家按实际情况选择。 当然,我们做项目肯定会用到 UI 框架,常...

张兴华ZHero
23分钟前
6
0
SpringBoot激活profiles你知道几种方式?

多环境是最常见的配置隔离方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,在SpringBoot内支持了多种配置隔离的方式,可以激活单个或者多个配置文件。 激活Profi...

恒宇少年
25分钟前
6
0
PDF修改文字的方法有哪些?怎么修改PDF文件中的文字

PDF修改文字一直以来都是一个难以解决的问题,很多的办公族在办公的时候会有修改PDF文件中的文字的需要,可是PDF文件一般是不能进行编辑和修改的,难道就没有什么办法解决这个问题了嘛?不要...

趣味办公社
28分钟前
4
0
企业组织中采用服务网格的挑战

作者:Christian Posta 译者:罗广明 原文:https://blog.christianposta.com/challenges-of-adopting-service-mesh-in-enterprise-organizations/ 编者按 本文作者介绍了企业组织采用服务网...

jimmysong
38分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部