ExecutorService - invokeAll 和 invokeAny 使用场景

简介: 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超时方法


image.png

目录
相关文章
|
6月前
|
存储 缓存 Java
如何创建一个线程池,为什么不推荐使用Executors去创建呢?
【6月更文挑战第2天】如何创建一个线程池,为什么不推荐使用Executors去创建呢?
45 1
|
7月前
|
存储 安全 Java
Java并发基础:BlockingQueue和BlockingDeque接口的区别?
BlockingQueue 和 BlockingDeque 它们都支持在并发编程中的线程安全操作,但是,这两个接口之间存在一些关键的区别,主要在于它们所支持的操作和数据结构的特性,
Java并发基础:BlockingQueue和BlockingDeque接口的区别?
|
存储 Java
JUC基础(二)—— Future接口 及其实现
JUC基础(二)—— Future接口 及其实现
169 1
创建多线程的方式二:实现Runnable接口
创建多线程的方式二:实现Runnable接口
67 0
创建多线程的方式三:实现Callable接口。
创建多线程的方式三:实现Callable接口。
74 0
|
Java
创建多线程的方式四:使用线程池
创建多线程的方式四:使用线程池
60 0
|
设计模式 Java API
【JUC基础】15. Future模式
Future 模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。当我们需要调用一个函数方法时,如果这个函数执行得很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。因此,我们可以让被调者立即返回,让它在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获得需要的数据。
151 0
【JUC基础】15. Future模式
|
Java C++
c++基于ThreadPool实现灵活的异步任务
c++基于ThreadPool实现灵活的异步任务
|
存储 Java
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(三)
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(一)
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(三)
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(一)
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(一)