ThreadPoolExecutor的使用简介

371 阅读2分钟

线程池的创建

ThreadFactory使用默认的Executors.defaultThreadFactory()

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

corePoolSize:

     核心线程数,即使处于空闲状态,也要保留在池中的线程数,除非将allowCoreThreadTimeOut设置为true。当提交一个任务到线程池时,线程池会创建一个新的线程来执行任务,即使其它空闲的线程能够执行新的任务也会创建线程,等到需要执行的任务数大于corePoolSize时,就不再创建。新的任务将加入BlockingQueue中。

maximumPoolSize:

     线程池所能容纳的最大线程数。如果队列满了,并且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程执行任务。如果使用了无界的任务队列,那么maximumPoolSize这个参数就没有效果。

keepAliveTime:

     线程池的工作线程空闲后,保持的存活时间。如果任务很多,并且执行的时间比较短,可以调大时间,提高线程的利用率。

workQueue:

     任务队列。用于保存等待执行的任务的阻塞队列。常用的有:

(1)ArrayBlockingQueue:一个基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序。
(2)LinkedBlockingQueue:一个基于链表结构的有界阻塞队列,此队列按FIFO原则对元素进行排序。静态方法Executors.newFixedThreadPool()、Executors.newSingleThreadExecutor()使用了这个队列。此队列的默认长度和最大长度为Integer.MAX_VALUE
(3)SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。静态方法Executors.newCachedThreadPool()使用了这个队列。
(4)PriorityBlockingQueue:一个具有优先级的无界阻塞队列。

RejectedExecutionHandler:

     拒绝策略,当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理。Java线程池框架提供4种策略:四种拒绝策略

(1)CallerRunsPolicy:只用调用者所在线程来运行任务
(2)AbortPolicy:直接抛出异常RejectedExecutionException
(3)DiscardPolicy:不处理
(4)DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务

线程池的主要处理流程