Executor
public interface Executor
1、 执行已提交的Runnable任务的对象;
2、 此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法;
3、 内存一致性效果:线程中将Runnable对象提交到Executor之前的操作happen-before其执行开始(可能在另一个线程中);
通俗地理解是线程的提交与如何执行分离,执行已提交的 Runnable 任务的对象即可对已提交的线程任务进行自定义操作。
public interface Executor {
/**
* 在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由 Executor 实现决定。
*/
void execute(Runnable command);
}
ExecutorService
public interface ExecutorService extends Executor
1、 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成Future的方法;
2、 可以关闭ExecutorService,这将导致其拒绝新任务;
3、 提供两个方法来关闭ExecutorServiceshutdown()方法在终止前允许执行以前提交的任务,而shutdownNow()方法阻止等待任务启动并试图停止当前正在执行的任务;
4、 内存一致性效果:线程中向ExecutorService提交Runnable或Callable任务之前的操作happen-before由该任务所提取的所有操作,后者依次happen-before通过Future.get()获取的结果;
方法摘要
void shutdown()
启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。
List shutdownNow()
试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
无法保证能够停止正在处理的活动执行任务,但是会尽力尝试。例如,通过 Thread.interrupt() 来取消典型的实现,所以任何任务无法响应中断都可能永远无法终止。
boolean isShutdown()
如果此执行程序已关闭,则返回 true。
boolean isTerminated()
如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用 shutdown 或 shutdownNow,否则 isTerminated 永不为 true。
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行。
一般shutdown之后,使用此方法保证所有以前提交的任务执行完成。
Future submit(Callable task)
提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get 方法在成功完成时将会返回该任务的结果。
如果想立即阻塞任务的等待,则可以使用 result = exec.submit(aCallable).get(); 形式的构造。
Future submit(Runnable task, T result)
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功完成时将会返回给定的结果result。
Future<?>
submit(Runnable task)
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在 成功 完成时将会返回 null。
等价于 submit(task, null)。
List invokeAll(Collection<? extends Callable>
tasks) throws InterruptedException
执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。
支持限时等待。
T invokeAny(Collection<? extends Callable>
tasks) throws InterruptedException, ExecutionException
执行给定的任务,如果某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
支持限时等待。
总结:
1、 Executor接口定义了execute()方法用来接收一个Runnable接口的对象,而ExecutorService接口中的submit()方法可以接受Runnable和Callable接口的对象;
2、 Executor中的execute()方法不返回任何结果,而ExecutorService中的submit()方法可以通过一个Future对象返回运算结果,invokeAll返回Futrue列表,invokeAny返回运算结果;
3、 ExecutorService可以关闭线程池shutDown,而Executor没有;
4、 ExecutorService可以通过Future.cancel取消等待中的任务,而Executor没有;
通俗地理解:ExecutorService是Executor的增强。在执行已提交的 Runnable 任务的对象基础上,可对线程池关闭,或通过Future获得运算结果或取消线程。