1.通过ThreadPoolExecutor创建
2.弄懂它的7个构造参数
a.int CorePoolSize //核心持的大小
b.int maxmunPoolSize //线程池最大线程数
c.long keepAliveTime //保持时间/额外线程的存活时间
d.TimeUnit unit //时间单位
e.BlockingQueueworkQueue //任务队列
f.ThreadFactory threadFactory //线程工厂
g.RejectedExecutionHandler handler //异常的捕捉器
辅助理解
1、看看ThreadPoolExecutor的构造函数
2、构造参数详解
corePoolSize:核心池的大小
默认情况下,在创建了线程池之后,线程池中的线程数为0
当有任务到来后,如果线程池中存活的线程数小于corePoolSize,则创建一个线程。
maximumPoolSize:线程池最大线程数
线程池中允许的最大线程数,这个参数表示了线程池中最多能创建的线程数量。
当任务数量比corePoolSize大时,任务添加到workQueue
当workQueue满了,将继续创建线程以处理任务。
maximumPoolSize表示当wordQueue满了,线程池中最多可以创建的线程数量。
keepAliveTime:
当线程池处于空闲状态时,超过keepAliveTime时间之后,空闲的线程会被终止。
只有当线程池中的线程数大于corePoolSize时,这个参数才会起作用,但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
当线程数大于corePoolSize时,如果一个线程的空闲时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。
unit:参数keepAliveTime的时间单位,有7种取值
TimeUnit.DAYS; //天
TimeUnit.HOURS; //小时
TimeUnit.MINUTES; //分钟
TimeUnit.SECONDS; //秒
TimeUnit.MILLISECONDS; //毫秒
TimeUnit.MICROSECONDS; //微妙
TimeUnit.NANOSECONDS; //纳秒
workQueue : 任务队列,阻塞队列,存储提交的等待任务。常见子类有
ArrayBlockingQueue;
LinkedBlockingQueue;
SynchronousQueue;
threadFactory : 线程工厂,指定创建线程的工厂
handler : 任务队列添加异常的捕捉器,当任务超出线程池范围和队列容量时,采取何种拒绝策略。参考 RejectedExecutionHandler,常见实现类。
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
3、看一个自定义线程的例子
做下简单演示
public class TestThreadPoolExecutor {
private static ExecutorService pool;
public static void main(String[] args) {
pool = new ThreadPoolExecutor(
1,//核心大小
2,//最大线程数
1000,//1000
TimeUnit.MILLISECONDS,//ms
new SynchronousQueue<Runnable>(),//队列
Executors.defaultThreadFactory(),//线程工厂
new ThreadPoolExecutor.AbortPolicy()//决绝策略,直接抛异常
);
for (int i = 0; i < 3; i++) {
pool.execute(new ThreadTask());
}
}
}
执行结果