2009年2月16日星期一

Executor为谁而生?---- 执行策略

Executor与Runnable的定义极为相似。为什么要加上个Executor?
public interface Executor {
    void execute(Runnable command);
}

public interface Runnable {
    void run()
}

Runnable规范了任务的入口。Thread提供了驱动任务的线程接口。
有了这两个interface,你就可以完成最简单的多线程程序。但是如果你实现一些执行策略,你将面临非常有挑战性的编程。什么是执行策略?执行策略定义了用线程执行任务的一些方式。如,可以有多少个任务可以并行?何种顺序(FIFO, FIFO,自定义的优先级算法)?最多有多少任务可以等待?如果超过了可等待的任务数,系统如何反应? 任务执行前做什么?任务执行后做什么?诸如此类。
Runnable和Thread没有从API上提供解决"执行策略"的任何线索。要实现你特定的执行策略就需要你利用Thread的sleep(),wait(),notify(), interrunppt(),isInterrupt()进行高水平的设计。
如果你的系统不同模块需要使用不同的执行策略,如果你的系统需要动态的调整执行策略,这些功能是不是更具挑战性?

Executor就是Thread和Runnable之间的一层隔离、解耦。这层隔离为Thread和Runnable之间实现多种交互提供了可能与方便。Executor的各种子类实际上就实现了各种不同的执行策略。

Exector的是java.util.concurrent的基石。

Link:Executor API
All Known Subinterfaces:
ExecutorService, ScheduledExecutorService
All Known Implementing Classes:
AbstractExecutorService, ScheduledThreadPoolExecutor, ThreadPoolExecutor