目录
一、看源码
1、ThreadPoolExecutor相关
java.util.concurrent 包下
√
\color{#FF7D00}{√}
√ 继承树:
1)、Executor:
- 只有一个 execute ( Runnable command ) 方法,没有返回值,但是没有标注@FunctionalInterface?
- 继承后,可以使用命令模式。
2)、ExecutorService:
- 在 executor 上封装了一层,提供了 Runnable(Callable) 的生命周期管理的方法,并且返回 Future 对象。
- 所以 submit() 和 execute() 的区别是提交的方法和是否有返回值。
- shutdown() 方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的 ExecutorService 以允许回收其资源。
3)、AbstractExecutorService:
- 提供了 ExecutorService 的默认实现,但是没有实现 Executor 的 execute 方法。
- 其中的 submit(Runnable task) 方法,其实是将 Runnable 转换为了 Callable
采用适配器模式,RunnableAdapter(task,result) 来适配
4)、ScheduledExecutorService
- 同上,可以做定时任务。
5)、ThreadPoolExecutor
- 线程池相关的
2、FutureTask相关
√
\color{#FF7D00}{√}
√ 继承树:
√ \color{#FF7D00}{√} √ Callable(FunctionalInterface)
- 只有一个 V call ( ) throws Exception 方法
- 和 Runnable 相比,有一个泛型,方法有返回值,且能抛异常,所以可以看作是 Runnable 的扩展
√ \color{#FF7D00}{√} √ Funture(interface)
- future模式的返回值,提供了检查任务是否完成,等待任务完成,检索任务结果等方法
1)、FutureTask常量
字段的偏移量,通过static代码块初始化:
state 使用 volatile 修饰,保证了可见性,搭配后续set等方法中的 Unsafe.putOrderedInt() 的有序写入。
定义了多个标识状态的常量,以及相应的状态流转:
2)、FutureTask方法
run方法:
set方法:执行成功保存结果。
先通过CAS操作,判断 stateOffset 和 NEW 相等,相等则把 COMPLETING 赋给 stateOffset,并执行下面操作;
保存执行结果,并将状态转为已完成
二、工具包
https://gitee.com/zilong123666/cabinet/tree/master/src/main/java/com/zilong/cabinet/thread