1、ThreadPoolExcutor创建线程池
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
}
参数讲解:
(1)int corePoolSize(核心线程数):
线程池新建线程的时候,如果当前线程总数小于corePoolSize,则新建的是核心线程,核心线程默认情况下会一直存活在线程池中;如果设置了 allowCoreThreadTimeOut 为 true,那么核心线程如果不干活的话,超过一定时间,就会被销毁掉。
(2)int maximumPoolSize(线程池能容纳的最大线程数量):
线程总数 = 核心线程数 + 非核心线程数。
(3)long keepAliveTime(非核心线程空闲存活时长):
非核心线程空闲时长超过该时长将会被回收
(4)TimeUnit unit 空闲线程的存活时间
在这里表示的是时间的单位,比如说秒。
(5)BlockingQueue workQueue(任务队列):
当所有的核心线程都在干活时,新添加的任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心线程执行任务。常用的workQueue类型:
①SynchornousQueue:这里表示接到新任务,直接交给线程处理,如果其他的线程都在工作,那就创建一个新的线程来处理这个任务。
②LinkedBlockingQueue:这里表示接到新任务,如果当前线程数小于核心线程数,则新建核心线程处理任务;如果当前线程数等于核心线程数,则进入队列等待。
③ArrayBlockingQueue:这里表示接到新任务,如果没有达到核心线程数,则新建核心线程执行任务,如果达到了,则入队等候,如果队列已满,则新建非核心线程执行任务,又如果总线程数到了 maximumPoolSize,并且队列也满了,则发生错误。
④DelayQueue:这里表示接到新任务,先入队,达到了指定的延时时间,才执行任务。
6.ThreadFactory threadFactory(线程工厂):
用来创建线程池中的线程。
7.RejectedExecutionHandler handler(拒绝策略):
指的之超过了maximumPoolSize,无法再处理新的任务,就会直接拒绝,提供了以下 4 种策略:
①AbortPolicy:默认策略,在拒绝任务时,会抛出RejectedExecutionException。
②CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。
③DiscardOldestPolicy:该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。
④DiscardPolicy:该策略默默的丢弃无法处理的任务,不予任何处理。
样例:
public class ThreadPoolUtil {
/**
* 线程缓冲队列
*/
private static BlockingQueue bqueue = new ArrayBlockingQueue(100);
/**
* 核心线程数,会一直存活,即使没有任务,线程池也会维护线程的最少数量
*/
private static final int SIZE_CORE_POOL = 5;
/**
* 线程池维护线程的最大数量
*/
private static final int SIZE_MAX_POOL = 10;
/**
* 线程池维护线程所允许的空闲时间
*/
private static final long ALIVE_TIME = 2000;
private static ThreadPoolExecutor pool = new ThreadPoolExecutor(SIZE_CORE_POOL, SIZE_MAX_POOL, ALIVE_TIME, TimeUnit.MILLISECONDS, bqueue, new ThreadPoolExecutor.CallerRunsPolicy());
static {
pool.prestartAllCoreThreads();
}
public static ThreadPoolExecutor getPool() {
return pool;
}
}