Executor框架(接口)负责在用户级别进行任务的调度和执行, 实现了任务调度和执行的分离.

在上层, java程序通过将应用分解为若干个任务(task), 然后使用用户级的调度器(Executor框架)将task映射为固定数量的Java线程.
在底层, Java线程与操作系统的线程是一一对应的关系, 由操作系统调度给可用的CPU. 底层的调度不受上层的影响.

主要包括3大组件:
异步任务:Runnable或者Callable的实现类;异步任务的调度和执行(用户级别): Executor接口的实现类ThreadPoolExecutor和ScheduledThreadPoolExecutor;异步计算的结果: 接口Future和接口的实现类FutureTask.组件间关系如下:

ThreadPoolExecutor是Executor框架的核心, 是线程池的实现类, 负责异步进行任务的调度和执行, 共有以下重要的配置参数:
corePoolSize: 核心线程池大小maximumPoolSize: 最大线程池大小;BlockingQueue: 用于保存任务的工作队列;通过工具类Executors, 可以快速创建3种预定义参数的ThreadPoolExecutor, 以下将分别进行分析.
被称为可重用固定线程数的线程池, 实际上就是ThreadPoolExecutor将corePoolSize和maximumPoolSize设置为相同大小, 同时使用了无界队列的情况.
同一时间只有一个线程在执行任务, 为了确保任务的顺序执行. 实际上就是FixedThreadPool, corePoolSize和maximumPoolSize设置为1的特殊情况.
corePoolSize设置为0, 在运行过程中会根据需要来创建线程执行任务, 使用没有容量的SynchronousQueue作为线程池的工作队列. 但是maximumPool是无界的, 所以适合于应对大量短任务的情况, 对于运行完任务的线程, 会有一个等待时间, 默认超过60秒没有新任务到来则自动销毁, 所以长时间保持空闲的CachedThreadPool不会使用任何资源.
未完待续
新闻热点
疑难解答