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
,它以定义的间隔重复执行指定的任务。