从这一节开始正式进入线程池的部分。其实整个体系已经拖了很长的时间,所以后面的章节会加快速度,甚至只是一个半成品或者简单化,之后有时间的慢慢补充、完善。html
其实线程池是并发包里面很重要的一部分,在实际状况中也是使用不少的一个重要组件。java
下图描述的是线程池API的一部分。广义上的完整线程池可能还包括Thread/Runnable、Timer/TimerTask等部分。这里只介绍主要的和高级的API以及架构和原理。多线程
大多数并发应用程序是围绕执行任务(Task)进行管理的。所谓任务就是抽象、离散的工做单元(unit of work)。把一个应用程序的工做(work)分离到任务中,能够简化程序的管理;这种分离还在不一样事物间划分了天然的分界线,能够方便程序在出现错误时进行恢复;同时这种分离还能够为并行工做提供一个天然的结构,有利于提升程序的并发性。[1]架构
并发执行任务的一个很重要前提是拆分任务。把一个大的过程或者任务拆分红不少小的工做单元,每个工做单元可能相关、也可能无关,这些单元在必定程度上能够充分利用CPU的特性并发的执行,从而提升并发性(性能、响应时间、吞吐量等)。并发
所谓的任务拆分就是肯定每个执行任务(工做单元)的边界。理想状况下独立的工做单元有最大的吞吐量,这些工做单元不依赖于其它工做单元的状态、结果或者其余资源等。所以将任务尽量的拆分红一个个独立的工做单元有利于提升程序的并发性。负载均衡
对于有依赖关系以及资源竞争的工做单元就涉及到任务的调度和负载均衡。工做单元的状态、结果或者其余资源等有关联的工做单元就须要有一个整体的调度者来协调资源和执行顺序。一样在有限的资源状况下,大量的任务也须要一个协调各个工做单元的调度者。这就涉及到任务执行的策略问题。异步
任务的执行策略包括4W3H部分:高并发
在后面的章节中会详细分写这些策略是如何实现的。咱们先来简单回答些如何知足上面的条件。性能
线程池的基本策略大体就这些,从下一节开始就从线程池的基本原理和执行方法开始描述。.net
[1] Java Concurrency in Practice