这些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
,它们可以在指定的时间间隔内重复执行指定的任务。