参数:
tasks - 任务 collection
返回:
表示任务的 Future 列表,列表顺序与给定任务列表的迭代器所生成的顺序相同,每个任务都已完成。
抛出:
InterruptedException - 如果等待时发生中断,在这种情况下取消尚未完成的任务。
NullPointerException - 如果任务或其任意元素为 null
RejectedExecutionException - 如果所有任务都无法安排执行
注意1
:该方法会一直阻塞直到所有任务完成。
List<Future>
invokeAll
(Collection<? extends Callable> tasks,
long timeout,
TimeUnit unit)
throws InterruptedException
执行给定的任务,当所有任务完成或超时期满时(无论哪个首先发生),返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。一旦返回后,即取消尚未完成的任务。注意,可以正常地或通过抛出异常来终止已完成 任务。如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
参数:
tasks - 任务 collection
timeout - 最长等待时间
unit - timeout 参数的时间单位
返回:
表示任务的 Future 列表,列表顺序与给定任务列表的迭代器所生成的顺序相同。
如果操作未超时,则已完成所有任务。如果确实超时了,则某些任务尚未完成。
抛出:
InterruptedException - 如果等待时发生中断,在这种情况下取消尚未完成的任务
NullPointerException - 如果任务或其任意元素或 unit 为 null
RejectedExecutionException - 如果所有任务都无法安排执行
注意1
:该方法会一直阻塞直到所有任务完成或超时。
注意2
:如果确实超时了,则某些任务尚未完成。【那么这些尚未完成的任务应该被系统取消】。
T invokeAny(Collection<? extends Callable> tasks)
throws InterruptedException,
ExecutionException
执行给定的任务,如果某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。
如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
参数:
tasks - 任务 collection
返回:
某个任务返回的结果
抛出:
InterruptedException - 如果等待时发生中断
NullPointerException - 如果任务或其任意元素为 null
IllegalArgumentException - 如果任务为空
ExecutionException - 如果没有任务成功完成
RejectedExecutionException - 如果任务无法安排执行
注意1
:该方法会一直阻塞直到有一个任务完成。
注意2
:一旦正常或异常返回后,
则取消尚未完成的任务
T
invokeAny(Collection<? extends Callable> tasks,
long timeout,
TimeUnit unit)
throws InterruptedException,
ExecutionException,
TimeoutException
执行给定的任务,如果在给定的超时期满前某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
参数:
tasks - 任务 collection
timeout - 最长等待时间
unit - timeout 参数的时间单位
返回:
某个任务返回的结果
抛出:
InterruptedException - 如果等待时发生中断
NullPointerException - 如果任务或其任意元素或 unit 为 null
TimeoutException - 如果在所有任务成功完成之前给定的超时期满
ExecutionException - 如果没有任务成功完成
RejectedExecutionException - 如果任务无法安排执行
注意1
:
该方法会一直阻塞直到有一个任务完成。
注意2
:一旦正常或异常返回后,
则取消尚未完成的任务
3.ThreadPoolExecutor
ThreadPoolExecutor是ExecutorService的一个实现类,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置。
线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。
每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。为了便于跨大量上下文使用,此类提供了很多可调整的参数和扩展钩子 (hook)。
但是,强烈建议程序员使用较为方便的 Executors 工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、Executors.newFixedThreadPool(int)(固定大小线程池)和 Executors.newSingleThreadExecutor()(单个后台线程),
它们均为大多数使用场景预定义了设置。否则,在手动配置和调整此类时,使用以下指导:
核心和最大池大小
ThreadPoolExecutor将根据corePoolSize(参见 getCorePoolSize())和 maximumPoolSize(参见 getMax