Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
java.util.concurrent 包定义了三个执行器接口:
Executor,一个支持启动新任务的简单接口。ExecutorService,Executor 的子接口,它添加了有助于管理生命周期的功能,包括单个任务和执行器本身。ScheduledExecutorService 是 ExecutorService 的子接口,支持将来和/或定期执行任务。通常,引用 executor 对象的变量被声明为这三种接口类型之一,而不是执行器类类型。
Executor 接口Executor 接口提供单个方法 execute,旨在替代常见的线程创建习惯用法。如果 r 是 Runnable 对象,并且 e 是 Executor 对象,则可以替换
(new Thread(r)).start();
with
e.execute(r);
但是,execute 的定义不太具体。低级习惯用法创建一个新线程并立即启动它。根据 Executor 实现,execute 可能会做同样的事情,但更有可能使用现有的工作线程来运行 r,或者将 r 放入队列以等待工作线程变为可用。(我们将在 Thread Pools 的部分中描述工作线程。)
java.util.concurrent 中的执行器实现旨在充分利用更高级的 ExecutorService 和 ScheduledExecutorService 接口,尽管它们也可以使用基本 Executor 接口。
ExecutorService 接口ExecutorService 接口使用类似但更通用的 submit 方法补充 execute。与 execute 一样,submit 接受 Runnable 对象,但也接受 Callable 对象,允许任务返回值。submit 方法返回 Future 对象,该对象用于获取 Callable 返回值并管理 Callable 和 Runnable 任务的状态。
ExecutorService 还提供了提交 Callable 对象的大集合的方法。最后,ExecutorService 提供了许多用于管理执行器关闭的方法。为了支持立即关闭,任务应正确处理 interrupts。
ScheduledExecutorService 接口ScheduledExecutorService 接口使用 schedule 补充其父 ExecutorService 的方法,它在指定的延时后执行一个 Runnable 或 Callable 任务。此外,接口定义 scheduleAtFixedRate 和 scheduleWithFixedDelay,它以定义的间隔重复执行指定的任务。