Concurrent----任务超时

配合RPC的时候这个超时判断是很有用的..


package com.wenniuwuren.concurrent;
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.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
 
/**
 * 启动任务,然后等待任务的计算结果,如果等待时间超出预设定的超时时间,则终止任务。
 * 
 * @author zhu.yb
 */
public class JobTimeoutDemo {
 
    public static void main(String[] args) {
        System.out.println("Start...");
        
        ExecutorService exec = Executors.newCachedThreadPool();
 
        testTask(exec, 11); // 在11秒内任务成功结束后计算结果,超过11秒终止
        testTask(exec, 5); //  等待5秒,任务还没结束,所以将任务中止
 
        exec.shutdown();
        System.out.println("End...");
    }
 
    public static void testTask(ExecutorService exec, int timeout) {
       
    	FutureTask<Boolean> future = null;
    	Boolean isTimeout = null;
    	String failReason = "任务执行成功";
    	
    	// 执行任务
        future = new FutureTask<Boolean>(new Callable<Boolean>() { // 执行任务
            public Boolean call() throws Exception {
            	// 总计耗时约10秒
                for (int i = 0; i < 100; i++) {
                    Thread.sleep(100);
                    System.out.print('-');
                }
                return Boolean.TRUE;
            }
        });
        exec.submit(future);
       
        try {
            // 等待计算结果,最长等待timeout秒,timeout秒后终止任务
        	isTimeout = future.get(timeout, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            failReason = "when a thread is waiting, sleeping, or otherwise occupied, " +
            		"and the thread is interrupted, either before or during the activity";
        } catch (ExecutionException e) {
            failReason = " attempting to retrieve the result of a task that aborted";
        } catch (TimeoutException e) {
            failReason = "a blocking operation times out";
            // 会等待之前提交的任务完成,关闭线程
        	exec.shutdown();  // 测试先放这里, 实际环境一般都是在finally里面执行
        } finally {
        }
 
        System.out.println("\nisTimeout : " + isTimeout);
        System.out.println("failReason : " + failReason);
    }
}
 


执行结果:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值