- 所有已知的子接口:
-
ExecutorService
,ScheduledExecutorService
public interface Executor
一个执行提交的
Runnable
任务的对象。该接口提供了一种将任务提交与每个任务的运行机制(包括线程使用、调度等细节)解耦的方式。一个Executor
通常用于代替显式创建线程。例如,而不是为一组任务中的每个任务调用new Thread(new RunnableTask()).start()
,您可以使用:
Executor executor = anExecutor();
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
...
然而,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<>();
final Executor executor;
Runnable active;
SerialExecutor(Executor executor) {
this.executor = executor;
}
public synchronized void execute(Runnable r) {
tasks.add(() -> {
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
类为这些执行程序提供了方便的工厂方法。
内存一致性效果: 在将Runnable
对象提交给Executor
之前的线程中的操作在其执行开始之前,可能在另一个线程中发生。
- 自 JDK 版本:
- 1.5
-
Method Summary
-
Method Details
-
execute
在将来的某个时间执行给定的命令。命令可能在新线程、池线程或调用线程中执行,由Executor
实现自行决定。- 参数:
-
command
- 可运行任务 - 抛出:
-
RejectedExecutionException
- 如果无法接受此任务进行执行 -
NullPointerException
- 如果命令为 null
-