Java并发学习之为任务设置时限
我们在开发中可能会遇到这种情况:
有时候如果某个任务无法在指定时间内完成,那么将不再需要它的结果,此时可以放弃这个任务。
例如:某个Web应用程序从外部的广告服务器上获取广告信息,但如果该应用程序在2s中不能得到响应,那么将显示一个默认的广告,类似的,一个门户网站可以从多个数据源并行的获得数据,但可能只会在指定的时间内等待数据,如果超出了等待时间,那么只显示已经得到的数据。
1.在有限的时间内执行任务的主要困难在于:要确保得到答案的时间不会超过限定的时间,或者在限定的时间内无法获得答案。
我们可以通过Futrue中的get方法解决这个问题:
上面的方法的执行逻辑是,当结果可用时,它将立即返回,如果在指定时限内没有计算出结果,那么将抛出TimeoutException.
2.在使用限时任务时要注意,当这些任务超时后应当立即停止,从而避免为计算一个不需要的结果而浪费资源。 如果一个限时的get方法抛出一个TimeoutException异常,那么我们可以通过Future来取消任务,如果编写的任务是可取消的,那么我们可以提前终止它。
例子:
在指定时间获取广告信息
Page renderPageWithAd() throws InterruptedException{
long endNanos = System.nanoTime() + TIME_BUDGET;//指定等待的时间
Future<Ad> f = exec.submit(new FetchAdTask());//提交获取广告任务
//在等待广告的同时显示页面
Page page = renderPageBody();
Ad ad;
try{
long timeLeft = endNanos - System.nanoTime();//只等待