Concurrent----任务超时

来源:互联网 发布:淘宝助手运费模板 编辑:程序博客网 时间:2024/06/05 07:27

配合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);    }} 


执行结果:



0 0
原创粉丝点击