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
不会使用任何资源.
未完待续
新闻热点
疑难解答