大多数并发应用程序都是围绕“任务执行”来构造的:任务通常是一些抽象且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构。而“任务执行”离不开线程,但线程的创建和管理是非常复杂的,为了简化这些复杂的线程管理模式,我们需要一个线程管理者来统一管理线程及任务分配,这就是线程池。 从本章开始,我们将对并发编程中另一个非常重要的概念-线程池进行详细的讲解。
任务是一组逻辑工作单元,而线程则是使任务异步执行的机制。而使用线程来管理任务执行,务必要考虑“为每个任务分配一个线程”的资源管理的复杂性,而线程池则简化了线程的管理工作,从JDK1.5开始,Java 类库提供了这种灵活的线程池框架-Executor。它为灵活且强大的异步任务执行执行提供了基础,该框架能支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程与执行过程解耦开来。并且 Executor 的实现还提供了对生命周期的支持,以及统计信息收集、应用程序管理机制和性能监视等机制。
框架结构
线程池框架结构
- Executor:线程池的最上层接口,提供了任务提交的基础方法。
- ExecutorService:提供了线程池管理的上层接口,如池销毁、任务提交、异步任务提交。
- ScheduledExecutorService:提供任务定时或周期执行方法的 ExecutorService。
- AbstractExecutorService:为 ExecutorService 的任务提交方法提供了默认实现。
- ThreadPoolExecutor:大名鼎鼎线程池类,提供线程和任务的调度策略。
- ScheduledThreadPoolExecutor:属于线程池的一种,它可以允许任务延迟或周期执行,类似java的Timer。
- ForkJoinPool:JDK1.7加入的成员,也是线程池的一种。只允许执行 ForkJoinTask 任务,它是为那些能够被递归地拆解成子任务的工作类型量身设计的。其目的在于能够使用所有可用的运算资源来提升应用性能。
- Executors:创建各种线程池的工具类。
简单来说,线程池分为三种:基础线程池ThreadPoolExecutor、延时任务线程池 ScheduledThreadPoolExecutor 和分治线程池ForkJoinPool。每种线程池中都有其支持的任务类型,后面我们在源码分析中,会穿插讲解各个线程池中遇到的各种任务类型。