一、类继承图 & 状态转化
线程池类继承图如下所示:
图1-1 线程池类继承图.png线程池状态转化图如下所示:
图1-2 线程池状态转化图.png二、ThreadPoolExecutor构造方法
构造方法包括7个参数:
- 线程池核心线程数最大值
- 线程池线程总数最大值(核心线程+非核心线程)
- 非核心线程闲置超时时长
- 时间单位
- 线程池任务队列
- ArrayBlockingQueue
- LinkedBlockingQuene
- SynchronousQuene
- priorityBlockingQuene
- 创建线程方式(接口,一般不用,默认为DefaultThreadFactory)
- 拒绝处理策略
- ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 (默认)
- ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)。
- ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。
三、任务执行过程
submit()在执行过程中把异常保存在成员变量中,在FutureTask.get阻塞获取的时候再把异常抛出来。线程池execute()执行方法则直接抛出异常,execute()方法执行流程如下所示:
图3-1 任务执行过程.png线程池关闭方法:
- shutdown():不立即终止线程池,等任务队列中的所有任务都执行完成才终止,不会再接收新的任务。
- shutdownNow():立即终止线程池,打断正在执行的任务,清空任务队列,返回为执行的任务。
四、实例
常用线程池:
- Executors.newCacheThreadPool()
- Executors.newFixedThreadPool(int n)
- Executors.newScheduledThreadPool(int n)
- Executors.newSingleThreadExecutor()
//import 省略
/**
* @author luffy
* @version 1.0
* @date 2020/1/09 17:23
**/
public class Test {
public static void main(String[] args){
ExecutorService pool = new ThreadPoolExecutor(5,10,60,TimeUnit.SECONDS,new ArrayBlockingQueue<>(5));
for (int i=0;i<15;i++){
Task task = new Task(i);
pool.execute(task);
System.out.println("线程池线程数量:"+((ThreadPoolExecutor) pool).getPoolSize());
System.out.println("队列中等待执行的任务数目:"+((ThreadPoolExecutor) pool).getQueue().size());
System.out.println("已执行完的任务数目:"+((ThreadPoolExecutor) pool).getCompletedTaskCount());
System.out.println();
}
pool.shutdown();
}
}
//import 省略
/**
* @author luffy
* @version 1.0
* @date 2020/1/9 16:14
**/
@Data
public class Task implements Runnable{
private int num;
Task(int num){
this.num = num;
}
@Override
public void run() {
System.out.println("开始执行"+num+"任务");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程"+this.num+"执行完毕!");
}
}
网友评论