ThreadPoolExecutor

241 阅读2分钟

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

参数介绍

  • corePoolSize 线程池的核心线程数:当有任务到线程池,会创建线程去完成这个任务,即使目前线程池里有空闲的线程也会创建线程,当执行的任务数大于核心线程数的时候就不会创建。
  • maximumPoolSize 最大线程数:若果队列满了,并且已经创建的线程数小于最大线程数,则创建新的线程。适用于有界队列。
  • keepAliveTime 线程活动时间:线程空闲后存活的时间。时间到了,如果超过线程核心数,会销毁线程。保存corePoolSize 如果任务很多建议调大,保证线程利用率。
  • unit 线程空闲后存活的时间单位
  • workQueue
    • ArrayBlockingQueue 有界阻塞队列
    • LinkedBlockingQueue 无界阻塞队列 吞吐量高于ArrayBlockingQueue
    • SynchronousQueue 一个只存储一个元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入一直处于阻塞状态,吞吐量高于LinkedBlockingQueue,Executors#newCachedThreadPoll()使用了这个队列
    • PriorityBlockingQueue 具有优先级的阻塞队列

线程变化

  • 当线程数小于核心线程数时,新建任务提交到线程池,即使有空闲线程也会创建新的线程。
  • 当线程数大于核心线程数时,新建任务提交到线程池,会把任务放到任务队列中,等待被调度。
  • 当队列已满,且maximumPoolSize>corePoolSize,新建任务提交到线程池,会新建线程。
  • 当提交任务数大于maximumPoolSize,会交给RejectedExecutionHandler处理。
  • 当线程池中的数目大于corePoolSize 空闲时间达到keepAliveTime会关闭空闲线程。
  • 当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭。