前言
最近看《JAVA并发编程实战》时,对Executor框架相关类和接口的作用不太明白。看了些资料,总结一下这些类的基本含义和功能。
正文
1,Executor接口
这个接口是这套体系结构的根接口,它只有一个方法,就是execute(Runnable command)
。这个方法的作用是执行一个实现了Rannable接口的任务
(也就是我们的业务逻辑)。
做这个接口的初衷,是想把任务
和“任务的运行方法(是怎样运行的)”、“线程的使用”、“线程的调度”分离开来(也就是解耦)。原来的使用方式如下:
new Thread(new(RunnableTask())).start()
新的使用方式:
// anExecutor是一个Executor的Executor实例
Executor executor = anExecutor;
// execute方法代表运行一个任务,但如何运行(同步、异步还是其它方式),还要看execute方法的实现方式
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
2,ExecutorService接口
ExecutorService接口继承了Executor接口,并在Executor接口的基础上,提供了一些方法,来管理“任务的执行方式”、查看“任务的状态”和管理“执行任务的容器”(在这个体系结构中,任务基础都是在一个“容器”内执行,而这个容器就是一个线程池(ThreadPoolExecutor))。例如:
- <T> Future<T> submit(Callable<T> task):执行一个Callable任务,并返回Future对象。可以通过这个Future对象来“取得任务结果”,“取消任务”等。
- Future<?> submit(Runnable task):执行一个Runnable任务。
- void shutdown():关闭服务,一直等到所有正在执行的任务执行完。新的任务不再被接受。
- boolean awaitTermination(long timeout, TimeUnit unit):阻塞当前线程,直到以下条件之一:
- Shutdown方法被调用,所有任务都执行完。
- 发生Timeout
- 当前线程被中断(interrupt)
3,ThreadPoolExecutor
ThreadPoolExecutor是ExecutorService的一个实现。使用池化的线程,执行用户提交的任务。通常,使用Executors的工厂方法来创建ThreadPoolExecutor。
4,Executors
这个类就像Collections类一样,是一个工具类。它提供工具方法和工厂方法为下面的这些类:
- Executor
- ExecutorService
- ScheduledExecutorService
- ThreadFactory
- Callable
5,Callable、Future和FutureTask
关于Callable、Future和FutureTask,请参看:Java并发编程:Callable、Future和FutureTask
参考:
Executor Interfaces
并发新特性—Executor 框架与线程池
Java并发编程:Callable、Future和FutureTask
Javadoc