# 执行器接口

> 原文： [https://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html](https://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html)

`java.util.concurrent`包定义了三个执行器接口：

*   `Executor`，一个支持启动新任务的简单接口。
*   `ExecutorService`，`Executor`的子接口，它添加了有助于管理生命周期的功能，包括单个任务和执行程序本身。
*   `ScheduledExecutorService`是`ExecutorService`的子接口，支持将来和/或定期执行任务。

通常，引用 executor 对象的变量被声明为这三种接口类型之一，而不是执行器类类型。

## `Executor`接口

[`Executor`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html) 接口提供单一方法`execute`，旨在替代常见的线程创建习惯用法。如果`r`是`Runnable`对象，`e`是`Executor`对象，则可以替换

```
(new Thread(r)).start();

```

同

```
e.execute(r);

```

但是，`execute`的定义不太具体。低级习语创建一个新线程并立即启动它。根据`Executor`实现，`execute`可能会做同样的事情，但更有可能使用现有的工作线程来运行`r`，或者将`r`置于队列中以等待工作线程变为可用。 （我们将在[线程池](pools.html)的部分中描述工作线程。）

`java.util.concurrent`中的执行程序实现旨在充分利用更高级的`ExecutorService`和`ScheduledExecutorService`接口，尽管它们也可以与基本`Executor`接口一起使用。

## `ExecutorService`接口

[`ExecutorService`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html) 接口使用类似但更通用的`submit`方法补充`execute`。与`execute`类似，`submit`接受`Runnable`对象，但也接受 [`Callable`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html) 对象，这允许任务返回一个值。 `submit`方法返回 [`Future`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html) 对象，该对象用于检索`Callable`返回值并管理`Callable`和`Runnable`任务的状态。

`ExecutorService`还提供了提交大量`Callable`对象集合的方法。最后，`ExecutorService`提供了许多管理执行程序关闭的方法。为了支持立即关闭，任务应正确处理[中断](interrupt.html)。

## `ScheduledExecutorService`接口

[`ScheduledExecutorService`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html) 接口使用`schedule`补充其父`ExecutorService`的方法，`schedule`在指定的延迟后执行`Runnable`或`Callable`任务。此外，接口定义`scheduleAtFixedRate`和`scheduleWithFixedDelay`，它以定义的间隔重复执行指定的任务。