Java里面线程池的顶级接口是Executor,可是严格意义上讲Executor并非一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。java
下面这张图完整描述了线程池的类体系结构。缓存
首先Executor的execute方法只是执行一个Runnable的任务,固然了从某种角度上将最后的实现类也是在线程中启动此任务的。根据线程池的执行策略最后这个任务可能在新的线程中执行,或者线程池中的某个线程,甚至是调用者线程中执行(至关于直接运行Runnable的run方法)。这点在后面会详细说明。并发
ExecutorService在Executor的基础上增长了一些方法,其中有两个核心的方法:高并发
这两个方法都是向线程池中提交任务,它们的区别在于Runnable在执行完毕后没有结果,Callable执行完毕后有一个结果。这在多个线程中传递状态和结果是很是有用的。另外他们的相同点在于都返回一个Future对象。Future对象能够阻塞线程直到运行完毕(获取结果,若是有的话),也能够取消任务执行,固然也可以检测任务是否被取消或者是否执行完毕。工具
在没有Future以前咱们检测一个线程是否执行完毕一般使用Thread.join()或者用一个死循环加状态位来描述线程执行完毕。如今有了更好的方法可以阻塞线程,检测任务执行完毕甚至取消执行中或者未开始执行的任务。操作系统
ScheduledExecutorService描述的功能和Timer/TimerTask相似,解决那些须要任务重复执行的问题。这包括延迟时间一次性执行、延迟时间周期性执行以及固定延迟时间周期性执行等。固然了继承ExecutorService的ScheduledExecutorService拥有ExecutorService的所有特性。.net
ThreadPoolExecutor是ExecutorService的默认实现,其中的配置、策略也是比较复杂的,在后面的章节中会有详细的分析。线程
ScheduledThreadPoolExecutor是继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现,在后面的章节中会有详细的分析。对象
这里须要稍微提一下的是CompletionService接口,它是用于描述顺序获取执行结果的一个线程池包装器。它依赖一个具体的线程池调度,可是可以根据任务的执行前后顺序获得执行结果,这在某些状况下可能提升并发效率。blog
要配置一个线程池是比较复杂的,尤为是对于线程池的原理不是很清楚的状况下,颇有可能配置的线程池不是较优的,所以在Executors类里面提供了一些静态工厂,生成一些经常使用的线程池。
在详细讲解ThreadPoolExecutor的时候会具体讨论上述参数配置后的意义和原理。
线程池是一个复杂的任务调度工具,所以它涉及到任务、线程池等的生命周期问题,在下一节中来探讨下这个问题。