**问题:**需要做这样一个旅行预订门户网站-----用户输入旅行的日期和其他需求,门户网站获取并显示来自多条航线,旅店或汽车租赁公司的报价。
**分析:**在获取不同公司报价的过程中,可能会调用web服务,访问数据库,执行一个EDI事务或其他机制。在这种情况下,不易让页面的相应时间受限于最慢的时间响应,而应该只显示在指定时间内收到的信息。对于没有及时响应的服务提供者,页面可以忽略他们,或者显示一个提示信息.
代码如下:
public class TimeBudget {
private static ExecutorService exec = Executors.newCachedThreadPool();
public List<TravelQuote> getRankedTravelQuotes(TravelInfo info,Set<TravelCompany> companies,
Comparator<TravelQuote> ranking,long time,TimeUnit unit) throws InterruptedException{
List<QuoteTask> tasks = new ArrayList<>();
for(TravelCompany company : companies) {
//添加任务线程
tasks.add(new QuoteTask(company, info));
}
//启动多个任务并行执行
List<Future<TravelQuote>> futures = exec.invokeAll(tasks,time,unit);
//创建旅游价格集合
//获取任务的iterator
List<TravelQuote> quotes = new ArrayList<>(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.getFailure(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 info) {
this.company = company;
this.travelInfo = info;
}
TravelQuote getFailure(Throwable t) {
return null;
}
TravelQuote getTimeoutQuote(CancellationException e) {
return null;
}
@Override
public TravelQuote call() throws Exception {
//征求报价
return company.solicitQuote(travelInfo);
}
}
interface TravelCompany{
TravelQuote solicitQuote(TravelInfo travelInfo);
}
interface TravelQuote{
}
interface TravelInfo{
}