Java的线程既是工作单元,也是执行机制。从jdk5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,执行机制由Executor来提供
10.1Executor框架简介
10.1.1Executor框架的两级调度模型
在上层,Java多线程程序通常把应用分解为若干任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程
在底层,操作系统内核将这些线程映射到硬件处理器上。这种两级调度模型的示意图如图10-1所示
1. Executor框架的结构
主要由3大部分组成
任务:包括被执行任务所需要实现的接口Runnable接口或者Callable接口
任务的执行:Executor、ExecutorService、ThreadPoolExecutor、ScheduledThreadExecutor
异步计算的结果:Futrue、FutureTask类
下面是这些类和接口的简介
Executor是一个接口,是框架的基础
ThreadPoolExecutor是核心实现类,用来执行被提交的任务
ScheduledThreadPoolExecutor是一个实现类,在指定延迟后执行任务,比Timer更强大
Future接口和FutureTask实现类,代表异步计算结果
Runnable和Callable接口的实现类,都可以被执行
Executor框架的使用示意图如下图所示
主线程首先要创建实现Runnable或者Callable接口的任务对象。工具类Exexutors可以把一个Runnable对象封装为一个Callable对象
然后可以把Runnable对象直接交给ExecutorService执行(ExecutorService.execute(Runnable))
或者也可以把Runnable对象或者Callable对象交给ExecutorService执行,ExecutorService.submit(Runnable task)或 ExecutorService.submit(Callable<T> task))
如果执行submit()方法,将返回一个实现了Future接口的对象,目前为止返回的是FutureTask对象。
由于FutureTask实现了Runnable,程序员也可以创建FutureTask,然后直接交给ExecutorService执行。
最后可通过FutureTask.get()方法来等待任务的完成。
2.Executor框架成员
Executors可以创建3种类型的ThreadPoolExecutor: SingleThreadExecutor、FixedThreadPool和CachedThreadPool
可以创建2种类型的ScheduledThreadPoolExecutor: ScheduledThreadPoolExecutor、SingleThreadSchuledExecutor