zoukankan      html  css  js  c++  java
  • InvokeAll -- 实现限时获取Future.get()结果,超时则取消任务

    使用invokeAll方法批量提交限时任务, 预期time out时间内所有任务都执行完,没有执行完的任务会自动取消

    限时获取旅游报价的样例

    package net.jcip.examples;
    
    import java.util.*;
    import java.util.concurrent.*;
    
    /**
     * QuoteTask
     * <p/>
     * Requesting travel quotes under a time budget
     *
     * @author Brian Goetz and Tim Peierls
     */
    public class TimeBudget {
        private static ExecutorService exec = Executors.newCachedThreadPool();
    
        public List<TravelQuote> getRankedTravelQuotes(TravelInfo travelInfo, Set<TravelCompany> companies,
                                                       Comparator<TravelQuote> ranking, long time, TimeUnit unit)
                throws InterruptedException {
            List<QuoteTask> tasks = new ArrayList<QuoteTask>();
            for (TravelCompany company : companies)
                tasks.add(new QuoteTask(company, travelInfo));
    
            List<Future<TravelQuote>> futures = exec.invokeAll(tasks, time, unit);
    
            List<TravelQuote> quotes =
                    new ArrayList<TravelQuote>(tasks.size());
            Iterator<QuoteTask> taskIter = tasks.iterator();
            for (Future<TravelQuote> f : futures) {
                QuoteTask task = taskIter.next();
                try {
                    quotes.add(f.get());
                } catch (ExecutionException e) {
                    quotes.add(task.getFailureQuote(e.getCause()));
                } catch (CancellationException e) {
                    quotes.add(task.getTimeoutQuote(e));
                }
            }
    
            Collections.sort(quotes, ranking);
            return quotes;
        }
    
    }
    
    class QuoteTask implements Callable<TravelQuote> {
        private final TravelCompany company;
        private final TravelInfo travelInfo;
    
        public QuoteTask(TravelCompany company, TravelInfo travelInfo) {
            this.company = company;
            this.travelInfo = travelInfo;
        }
    
        TravelQuote getFailureQuote(Throwable t) {
            return null;
        }
    
        TravelQuote getTimeoutQuote(CancellationException e) {
            return null;
        }
    
        public TravelQuote call() throws Exception {
            return company.solicitQuote(travelInfo);
        }
    }
    
    interface TravelCompany {
        TravelQuote solicitQuote(TravelInfo travelInfo) throws Exception;
    }
    
    interface TravelQuote {
    }
    
    interface TravelInfo {
    }
  • 相关阅读:
    Spring Boot邮件功能
    jenkins自动部署
    spring boot定时任务解析
    类的加载classload和类对象的生成
    排序算法
    Robbin负载均衡
    ActiveMQ消息中间件
    hystrix熔断器
    css3整理--calc()
    css3整理--media
  • 原文地址:https://www.cnblogs.com/sulishihupan/p/14392056.html
Copyright © 2011-2022 走看看