future给任务设置时限

     如果一个活动无法再某个确定的时间内完成,那么它的结果就失效了,此时程序可以放弃该活动。

使用future.get(timeout, unit):在结果准备好后立即返回,如果在时限内没有准备好,就会抛出TimeoutException。

     如果任务超时后,future.cancel(true)取消任务。

小案例:在预期时间加载广告页面

package com.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;


/**
 * 为任务设置时限
 * 
 * 为任务设置预期完成时间,如果get超时,取消任务,并使用模式的信息取代它
 * 
 * f.get(timeout, unit)
 * future.get("预期时间值","预期时间单位"),如果超过指定的预期返回时间还不能返回结果,那么就会抛出TimeoutException的异常
 * 
 * f.get()如果不带参数,那么会堵塞直到返回结果
 * @author hadoop
 *
 */
public class TimeoutThread {

	    //固定大小的线程池,同时只能接受5个任务
		static  ExecutorService mExecutor = Executors.newFixedThreadPool(5);
		final static long timeout = 4 ;
		
	    /**
	     * 模拟在预定时间内获取广告信息
	     * @throws InterruptedException
	     */
		static void rederPageWithAd(final String pageTitle)  throws  InterruptedException{
			Future<String> f = mExecutor.submit(new Callable<String>() {
				@Override
				public String call() throws Exception {
					System.out.println("开始加载广告信息");
					int randomTime = new Random().nextInt(5) + 1;//限制耗时不会出现0s,不会大于10s
					Thread.sleep(randomTime * 1000);
					System.out.println("正常加载广告耗时:" + randomTime +"s");
					return pageTitle;
				}
			});
			
			String page;
			try {
				//在预计时间内等待
				System.out.println("预期任务执行完时间:" + timeout + "s");
				//page = f.get();
				page = f.get(timeout, TimeUnit.SECONDS);
			} catch (ExecutionException e) {
				page = "出现执行异常,显示默认的广告页面";
			} catch (TimeoutException e) {
				page = "任务执行超时,显示默认的广告页面";
				f.cancel(true);//取消没有执行完的任务,设置为ture说明任务能被中断,否则执行中的任务要完成
			}
			System.out.println("成功加载广告页面:" + page);
			
	
		}
		
		
		public static void main(String[] args) {
			try {
				List<String> titleList = new ArrayList<String>();
				titleList.add("体育赛事");
				titleList.add("娱乐新闻");
				titleList.add("实时聚焦");
				titleList.add("国际咨询");
				titleList.add("影视天下");
				titleList.add("游戏风云");
				for (String string : titleList) {
					rederPageWithAd(string);
				}
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally{
		            /**
			     * 只有执行了shutdown方法,执行isTerminated才有效。否则isTerminated一直为ture
			     */
			    mExecutor.shutdown();
			    while(true){
					if(mExecutor.isTerminated()){
						System.out.println("所有任务都执行完了,关闭线程池");
						break;
					}
				}
			}
			
		}
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斗者_2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值