(手机横屏看源码更方便)
<人力资源/>注:java源码分析部分如无特殊说明均基于java8版本。
简介
Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己在面试中的表现,增加被录取的可能性。
本系列将分成很多个章节,本章作为线程池的第一章将对整个线程池体系做一个总览。
体系结构
上图列举了线程池中非常重要的接口和类:
(1)遗嘱执行人,线程池顶级接口;
(2) ExecutorService,线程池次级接口,对执行器做了一些扩展,增加一些功能,
(3) ScheduledExecutorService,对ExecutorService做了一些扩展,增加一些定时任务相关的功能,
(4) AbstractExecutorService,抽象类,运用模板方法设计模式实现了一部分方法;
(5) ThreadPoolExecutor,普通线程池类,这也是我们通常所说的线程池,包含最基本的一些线程池操作相关的方法实现;
(6) ScheduledThreadPoolExecutor,定时任务线程池类,用于实现定时任务相关功能,
(7) ForkJoinPool,新型线程池类,java7中新增的线程池类,基于工作窃取理论实现,运用于大任务拆小任务,任务无限多的场景;
(8)执行人,线程池工具类,定义了一些快速实现线程池的方法(谨慎使用),
执行人
线程池顶级接口,只定义了一个执行无返回值任务的方法。
<代码类="语言java ">公共接口执行人{//执行无返回值任务,本文由公从号“彤哥读源码”原创 无效执行(可运行命令); }代码>
ExecutorService
线程池次级接口,对执行器做了一些扩展,主要增加了关闭线程池,执行有返回值任务,批量执行任务的方法。
<代码类="语言java ">公共接口ExecutorService延伸执行人{//关闭线程池,不再接受新任务,但已经提交的任务会执行完成 空间关闭();//立即关闭线程池,尝试停止正在运行的任务,未执行的任务将不再执行//被迫停止及未执行的任务将以列表的形式返回 ListshutdownNow ();//检查线程池是否已关闭 布尔isShutdown ();//检查线程池是否已终止,只有在关闭()或shutdownNow()之后调用才有可能为真实的 布尔isTerminated ();//在指定时间内线程池达到终止状态了才会返回现实 布尔awaitTermination(长超时,TimeUnit unit) 抛出InterruptedException;//执行有返回值的任务,任务的返回值为task.call()的结果 & lt; T>Future 提交(Callable 任务);//执行有返回值的任务,任务的返回值为这里传入的结果//当然只有当任务执行完成了调用得到()时才会返回 & lt; T>Future 提交(T可运行的任务,结果);//执行有返回值的任务,任务的返回值为null//当然只有当任务执行完成了调用得到()时才会返回 Future<?比;提交(Runnable任务);//批量执行任务,只有当这些任务都完成了这个方法才会返回 & lt; T>List 比;invokeAll (Collection<?扩展Callable List 比;invokeAll (Collection<?扩展Callable T invokeAny (Collection<?扩展Callable T invokeAny (Collection<?扩展Callable
ScheduledExecutorService
对ExecutorService做了一些扩展,增加一些定时任务相关的功能,主要包含两大类:执行一次,重复多次执行。
<代码类="语言java ">公共接口ScheduledExecutorService延伸ExecutorService {//在指定延时后执行一次 公共ScheduledFuture<?比;计划(可运行的命令, 长时间的推迟,TimeUnit unit);//在指定延时后执行一次 公共& lt; V>ScheduledFuture死磕java线程系列之线程池深入解析——体系结构