未完待续
jdk:1.8.0_65
1.线程池类图
由图可见,线程池入口为Executors,实现逻辑在ThreadPoolExecutor
2.线程池状态,以及如何转换
1 //运行中
2 private static final int RUNNING = -1 << COUNT_BITS;
3 //关闭,执行完当前线程,以及阻塞队列中线程
4 private static final int SHUTDOWN = 0 << COUNT_BITS;
5 //停止,停止正在执行的线程
6 private static final int STOP = 1 << COUNT_BITS;
7 //过渡阶段,所有线程执行完成,包括阻塞对了中的线程
8 private static final int TIDYING = 2 << COUNT_BITS;
9 //终止。线程池调用terminated()后的状态
10 private static final int TERMINATED = 3 << COUNT_BITS;
3.线程池种类
newCachedThreadPool 缓存型线程池,首先查看线程池中是否有以前建立的线程池,如果有就reuse,没有就新建一个线程入池
newFixedThreadPool(2) 固定数量线程的线程池
newSingleThreadExecutor 单线程的线程池,即任意时间线程池中只有一个线程
newScheduledThreadPool(4) 调度型线程池,这个线程池中的线程按照schedule依次delay执行
newSingleThreadScheduledExecutor
4.创建线程池
线程池六个参数:
核心线程数
最大线程数
空闲的线程保留时间
空闲线程保留时间单位
阻塞队列,存储等待执行的任务
线程工厂,用来创建线程
5 停止线程的三种方式
1)使用stop强行终止正在运行或是挂起的线程 thread.stop()。此方法不安全,
2)使用退出标志,使线程正常退出,当run方法完成后线程终止。针对不停止的线程无效。
3)使用interrupt中断线程,Thread.currentThread().interrupt(),当interrupt被调用的时候,InterruptedExecution将被抛出,故可以设计时在run方法中捕获异常,让线程安全退出。
6.源码解读,以及流程图
7.线程池如何做到重用线程