从jdk5开始,把工作单元和执行机制分离开来。工作单元包括 Runnable 和 Callable,而执行机制由 Executor 框架提供。
一、Executor框架:
1、Executor框架两级调度模型:
在上层,java多线程程序把应用分解为若干个任务,然后执行用户级调度器,即Executor框架,将任务映射为若干数量的线程。
在底层,操作系统内核将这些线程映射到硬件处理器上。
应用程序由Executor框架控制上层调度,下层调度由操作系统内核控制,下层调度不受到应用程序控制。
2、Executor框架结构:主要由3大部分组成
(1)任务:被执行任务需要实现的接口,Runnable接口、Callable接口。
(2)任务的执行:任务执行机制的核心接口Executor,以及继承自 Executor 的 ExecutorService 接口。ExecutorService 有两个实现类 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor。
(3)异步计算的结果:包括接口 Future 和实现 Futrue 接口的 FutureTask 类。
3、Executor框架的使用:
(1)任务创建:主线程首先创建实现 Runnable 或者 Callable 接口的任务对象。工具类 Executors 可以把一个 Runnable 对象封装为一个 Callable 对象,Executors.callable(Runnable task) 或
Executor.callable(Runnable task,Object resule)。
(2)执行:然后把Runnable 对象直接交给 ExecutorService 执行, ExecutorService.execute(Runnable command);或者也可以把Runnable 对象提交给ExecutorService执行,ExecutorService.submit(Runnable task)或 ExecutorService.submit(Callable<T> task)。
如果执行ExecutorService.submit(...),ExecutorService 将返回一个实现Future接口的对象FutureTask。由FutureTask实现了Runnable,也可以直接创建FutureTask,然后直接交给ExecutorService运行。
(3)获取结果:主线程可以执行FutureTask.get()方法来等待任务执行完成。主线程也可以执行FutureTask.cancle(boolean mayInterruptIfRunning),来取消此任务创建。
4、Executor框架的成员:ThreadPoolExecutor、ScheduledThreaPoolExecutor、Future 接口、Runnable 接口、Callable 接口和 Executors 工厂类。
ThreadPoolExecutor是Executor框架最核心的线程池实现类。
通过Executors工厂类可以创建四种线程池,分别是FixedThreadPool、SingleThreadExecutor、CachedThreadPool、ScheduledThreaPoolExecutor。