ExecutorService - invokeAll 和 invokeAny 使用场景
Posted 程序员牧码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ExecutorService - invokeAll 和 invokeAny 使用场景相关的知识,希望对你有一定的参考价值。
ExecutorService 方法
public interface ExecutorService extends Executor {
//不再接受新任务,待所有任务执行完毕后关闭ExecutorService
void shutdown();
//不再接受新任务,直接关闭ExecutorService,返回没有执行的任务列表
List<Runnable> shutdownNow();
//判断ExecutorService是否关闭
boolean isShutdown();
//判断ExecutorService是否终止
boolean isTerminated();
//等待ExecutorService到达终止状态
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
<T> Future<T> submit(Callable<T> task);
//当task执行成功的时候future.get()返回result
<T> Future<T> submit(Runnable task, T result);
//当task执行成功的时候future.get()返回null
Future<?> submit(Runnable task);
//批量提交任务并获得他们的future,Task列表与Future列表一一对应
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
//批量提交任务并获得他们的future,并限定处理所有任务的时间
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit) throws InterruptedException;
//批量提交任务并获得一个已经成功执行的任务的结果
<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
应用场景
1、invokeAny
需求描述:海量数据文件系统,我们需要找出其中某个资源(可以确定的是:该文件系统的资源都是唯一的)
我们可能启动多个线程去各自负责自己的区域,比如线程A负责Area_A,线程B负责Area_B,这样可以大规模的提升速度。但是我们希望只要其中一个线程找到符合要求的数据时 我们就立即返回,而不用还让其他线程继续执行下去,这样可以节省CPU使用率。而invokeAny就可以很好的解决这个问题,只要其中一个线程执行完了,就会立即返回,其他线程就会退出,不在占用cpu资源。
2、invokeAll
需求描述:海量数据文件系统的搜索功能,但和上面的不同,里面存在多个相似的资源,需要全部查出来。
3、invokeAll超时方法
在指定的时间范围内,如果没有执行完,则取消没有执行完的任务。
以上是关于ExecutorService - invokeAll 和 invokeAny 使用场景的主要内容,如果未能解决你的问题,请参考以下文章
Java 中这段代码中的 ExecutorService.submit 和 ExecutorService.execute 有啥区别?
ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析