这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践并未利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变化,了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发布说明,了解所有JDK版本中的新功能、增强功能以及已删除或弃用选项的信息。
java.util.concurrent包定义了三个执行器接口:
Executor,一个简单的接口,支持启动新任务。ExecutorService,Executor的子接口,增加了一些功能,用于管理单个任务和执行器本身的生命周期。ScheduledExecutorService,ExecutorService的子接口,支持任务的未来和/或周期性执行。通常,引用执行器对象的变量声明为这三个接口类型之一,而不是执行器类类型。
Executor接口Executor接口提供了一个方法execute,旨在作为常见线程创建惯用法的替代方法。如果r是一个Runnable对象,e是一个Executor对象,你可以将
(new Thread(r)).start();
替换为
e.execute(r);
然而,execute的定义不够具体。低级惯用法创建一个新线程并立即启动它。根据Executor的实现,execute可能会做相同的事情,但更可能使用现有的工作线程来运行r,或者将r放入队列中等待工作线程可用。(我们将在线程池部分介绍工作线程。)
java.util.concurrent中的执行器实现旨在充分利用更高级的ExecutorService和ScheduledExecutorService接口,尽管它们也与基本的Executor接口一起使用。
ExecutorService接口ExecutorService接口通过一个类似但更灵活的submit方法来补充execute。与execute一样,submit接受Runnable对象,但也接受Callable对象,允许任务返回一个值。submit方法返回一个Future对象,用于检索Callable的返回值和管理Callable和Runnable任务的状态。
ExecutorService 还提供了提交大量 Callable 对象的方法。最后,ExecutorService 提供了一些管理执行器关闭的方法。为了支持立即关闭,任务应该正确处理中断。
ScheduledExecutorService 接口ScheduledExecutorService 接口补充了其父接口 ExecutorService 的方法,包括 schedule,它在指定延迟后执行一个 Runnable 或 Callable 任务。此外,该接口定义了 scheduleAtFixedRate 和 scheduleWithFixedDelay,它们可以在指定的时间间隔内重复执行指定的任务。