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<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
类为这些 Executor 提供了便捷的工厂方法。
内存一致性效果:线程中将 Runnable
对象提交到 Executor
之前的操作 happen-before 其执行开始(可能在另一个线程中)。
方法摘要 | |
---|---|
void |
execute(Runnable command) 在未来某个时间执行给定的命令。 |
方法详细信息 |
---|
void execute(Runnable command)
command
- 可运行的任务
RejectedExecutionException
- 如果不能接受执行此任务。
NullPointerException
- 如果命令为 null