java.util.concurrent
包定义了三个执行器接口:
Executor
,一个简单的接口,支持启动新任务。ExecutorService
,是Executor
的子接口,它添加了有助于管理生命周期的功能,包括各个任务和执行器本身。ScheduledExecutorService
,是ExecutorService
的子接口,支持将来和/或定期执行任务。
通常,引用执行器对象的变量被声明为这三种接口类型之一,而不是执行器类类型。
Executor
接口
Executor
接口提供了一种单一方法execute
,旨在替代常见的线程创建惯用语。如果r
是Runnable
对象,并且e
是Executor
可以替换的对象Executor
接口提供了一种execute
方法,旨在替代常用的线程创建习惯用法。 如果r
是Runnable
对象,而e
是Executor
对象,则可以替换
(new Thread(r)).start();
与
e.execute(r);
但是,execute
的定义不太明确。 低级方法创建一个新线程并立即启动它。 取决于Executor
的实现,execute
可能执行相同的操作,但是更有可能使用现有的工作线程来运行r
,或将r
放入队列中以等待工作线程可用。 (我们将在“线程池”部分中描述辅助线程。)
尽管java.util.concurrent
中的执行器实现也与基本Executor接口一起使用,但它们的设计目的是充分利用更高级的ExecutorService
和ScheduledExecutorService
接口。
ExecutorService
接口
ExecutorService
接口补充了一种类似execute
但功能更广泛的submit
方法。 与execute
一样,submit
接受Runnable
对象,但也接受Callable
对象,后者允许任务返回值。 submit
方法返回一个Future
对象,该对象用于检索Callable
返回值并管理Callable
和Runnable
任务的状态。ExecutorService
还提供用于提交大量Callable
对象的方法。 最后,ExecutorService
提供了许多方法来管理执行器的关闭。 为了支持立即关闭,任务应正确处理中断。
ScheduledExecutorService
接口
ScheduledExecutorService
接口使用schedule
补充其父ExecutorService
的方法,schedule
在指定的延迟后执行Runnable
或Callable
任务。 另外,该接口定义了scheduleAtFixedRate
和scheduleWithFixedDelay
,它们以定义的间隔重复执行指定的任务。