Executor框架结构图
线程池.pngExecutor框架主要由3大部分组成:
- 任务: 包括被执行的任务需要实现的接口:Runable 接口、Callable接口
- 任务的执行: 包括任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。Executor框架有两个关键类实现了ExecutorService接口:ThreadPoolExecutor 和 ScheduledThreadPoolExecutor
- 任务的异步计算结果: 包括Future接口和实现Future接口的FutureTask类、ForkJoinTask类。
类成员说明
Runnable和Callable
- 两者都可以用来进行多线程编程;Runnable接口没有返回值,Callable接口有返回值;
- Runnable接口可以直接与Thread类一起工作,但是Callable接口需要配合FutureTask类才能与Thread类一起工作;
- Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛。
Future
Future保存异步计算的结果,该接口提供以下的方法
方法 | 描述 |
---|---|
cancel(boolean mayInterruptIfRunning) | 试图取消执行的任务,参数为true时直接中断正在执行的任务,否则直到当前任务执行完成,成功取消后返回true,否则返回false |
isCancel() | 判断任务是否在正常执行完前被取消的,如果是则返回true |
isDone() | 判断任务是否已完成 |
get() | 等待计算结果的返回(阻塞方法),如果计算被取消了则抛出异常 |
get(long timeout,TimeUtil unit) | 设定计算结果的返回时间,如果在规定时间内没有返回计算结果则抛出异常 |
Executor
是Executor框架的基础,它将任务的提交与任务的执行分离开来。
ExecutorService
ExecutorService接口继承了Executor接口,定义了一些生命周期的方法。
方法 | 说明 |
---|---|
shutdown() | 顺次地关闭ExecutorService,停止接收新的任务,等待所有已经提交的任务执行完毕之后,关闭ExecutorService |
shutdownNow() | 阻止等待任务启动并试图停止当前正在执行的任务,停止接收新的任务,返回处于等待的任务列表 |
isShutdown() | 判断线程池是否已经关闭 |
isTerminated() | 如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用 shutdown 或 shutdownNow,否则 isTerminated 永不为 true。 |
awaitTermination(long timeout, TimeUnit unit) | 等待(阻塞)直到关闭或最长等待时间或发生中断,timeout - 最长等待时间 ,unit - timeout 参数的时间单位 如果此执行程序终止,则返回 true;如果终止前超时期满,则返回 false |
submit(Callable<T> task) | 提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get 方法在成功完成时将会返回该任务的结果。 |
submit(Runnable task, T result) | 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功完成时将会返回给定的结果。 |
submit(Runnable task) | 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功 完成时将会返回 null |
invokeAll(Collection<? extends Callable<T>> tasks) | 执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。 |
invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) | 执行给定的任务,返回一个包含所有任务完成或超时结束时的状态和结果的Future列表,以先发生的情况为准。对于返回列表的每个元素,Future.isDone()都为真。返回时,未完成的任务将被取消。请注意,已完成的任务可以正常终止,也可以通过抛出异常终止。如果在执行此操作时修改了给定集合,则此方法的结果是未定义的。 |
invokeAny(Collection<? extends Callable<T>> tasks) | 执行给定的任务,如果某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。 |
invokeAny(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit) | 执行给定的任务,如果在给定的超时期满前某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。 |
AbstractExecutorService
提供 ExecutorService 执行方法的默认实现
ExecutorService接口继承自Executor接口,它提供了更丰富的实现多线程的方法,比如,ExecutorService提供了关闭自己的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以调用ExecutorService的shutdown()方法来平滑地关闭 ExecutorService,调用该方法后,将导致ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关闭ExecutorService。因此我们一般用该接口来实现和管理多线程。
ExecutorService的生命周期包括三种状态:运行、关闭、终止。创建后便进入运行状态,当调用了shutdown()方法时,便进入关闭状态,此时意味着ExecutorService不再接受新的任务,但它还在执行已经提交了的任务,当素有已经提交了的任务执行完后,便到达终止状态。如果不调用shutdown()方法,ExecutorService会一直处在运行状态,不断接收新的任务,执行新的任务,服务器端一般不需要关闭它,保持一直运行即可。
网友评论