从 Java 5 开始,Java 提供了本身的线程池。线程池就是一个线程的容器,每次只执行额定数量的线程。 java.util.concurrent.ThreadPoolExecutor 就是这样的线程池。它很灵活,但使用起来也比较复杂,本文就对其作一个介绍。 java
首先是构造函数。以最简单的构造函数为例: 函数
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue)
public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) 线程
看起来挺复杂的。这里介绍一下。 队列
corePoolSize 指的是保留的线程池大小。
maximumPoolSize 指的是线程池的最大大小。
keepAliveTime 指的是空闲线程结束的超时时间。
unit 是一个枚举,表示 keepAliveTime 的单位。
workQueue 表示存听任务的队列。 it
咱们能够从线程池的工做过程当中了解这些参数的意义。线程池的工做过程以下: 容器
一、线程池刚建立时,里面没有一个线程。任务队列是做为参数传进来的。不过,就算队列里面有任务,线程池也不会立刻执行它们。 线程池
二、当调用 execute() 方法添加一个任务时,线程池会作以下判断: 构造函数
a. 若是正在运行的线程数量小于 corePoolSize,那么立刻建立线程运行这个任务; 方法
b. 若是正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列。 im
c. 若是这时候队列满了,并且正在运行的线程数量小于 maximumPoolSize,那么仍是要建立线程运行这个任务;
d. 若是队列满了,并且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常,告诉调用者“我不能再接受任务了”。
三、当一个线程完成任务时,它会从队列中取下一个任务来执行。
四、当一个线程无事可作,超过必定的时间(keepAliveTime)时,线程池会判断,若是当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。因此线程池的全部任务完成后,它最终会收缩到 corePoolSize 的大小。