Executor
一个执行提交的Runnable任务的对象。这个接口提供了一种方式将任务提交和每个任务如何运行分离,包括线程使用、调度等详情。Executor 通常是用来替代显示创建线程。例如,除了调用new Thread(new RunnableTask()).start() 执行任务,你可以使用:
Executor executor = anExecutor;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
...
Executor 接口并没有直接要求执行任务是异步的。在最简单的例子中,一个executor可以在调用线程中立即运行提交的任务:
class DirectExecutor implements Executor {
public void execute(Runnable r) {
r.run();
}
}}
通常,任务是由其他线程执行而不是调用线程。下面的执行器为每个任务创建一个新线程。
class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
new Thread(r).start();
}
}}
许多 Executor 实现对任务的调度方式和时间施加了某种限制。下面的执行器实现类序类化提交的任务给第二个执行器,阐述了一个复合执行器。
class SerialExecutor implements Executor {
final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
final Executor executor;
Runnable active;
SerialExecutor(Executor executor) {
this.executor = executor;
}
public synchronized void execute(final Runnable r) {
tasks.offer(new Runnable() {
public void run() {
try {
r.run();
} finally {
scheduleNext();
}
}
});
if (active == null) {
scheduleNext();
}
}
protected synchronized void scheduleNext() {
if ((active = tasks.poll()) != null) {
executor.execute(active);
}
}
}}
这个包中的Executor 实现类实现了ExecutorService ,这是一个更通用的接口。ThreadPoolExecutor 类提供了一个可扩展的线程池实现。Executors 类为那些执行器提供方便的工厂方法。
|