美文网首页
ExecutorService之invokeAll和invoke

ExecutorService之invokeAll和invoke

作者: jerrik | 来源:发表于2017-09-25 16:50 被阅读0次

    先看看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资源。

    1. invokeAll

    需求描述:海量数据文件系统的搜索功能,但和上面的不同,里面存在多个相似的资源,需要全部查出来。

    1. invokeAll超时方法


      image.png

      在指定的时间范围内,如果没有执行完,则取消没有执行完的任务。

    相关测试DEMO请参考:https://github.com/jerrik123/ExecutorService_invokeAll_Any

    相关文章

      网友评论

          本文标题:ExecutorService之invokeAll和invoke

          本文链接:https://www.haomeiwen.com/subject/shurextx.html