• 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 {
    }
  • 相关阅读:
    晕倒的AIX
    MySQL Replication(zt)
    pxe启动网络安装CentOS(win平台)(zt)
    几句比较实用的script
    改注册表方式防DDOS攻击[ZT]
    一个免费空间列表相对集中的地方
    CREE LED的一个小资料
    下一步准备研究的东西:rsync远程同步
    PXE启动安装Linux (zt)
    系统调用
  • 原文地址:https://www.cnblogs.com/sulishihupan/p/14392056.html
Copyright © 2020-2023  润新知