Back to Posts

线程池的四种构造方式

Posted in MultiThread

Executor是一个顶层接口,java通过Executors工厂类提供了newFixThreadPool和newCachedThreadPool等方法,方便创建线程池。

在这里工厂方法底层,实际上都是通过new ThreadPoolExecutor来完成;

构造方法

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
参数作用
corePoolSize核心线程数,如果不设置allowCoreThreadTimeOuttrue;它将常驻内存
maximumPoolSize线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。如果使用了==无界的任务队列==这个参数就没用了
keepAliveTime非核心线程的闲置超时时间,超过这个时间就会被回收。==只针对非核心线程==
unit指定keepAliveTime的单位;比如毫秒
workQueue线程池中的任务队列.常用的有三种队列,SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue。

workQueue的作用:

  • ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
  • LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列
  • SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。

你看那个人好像一条狗啊

Read Next

VUE