有时候会有一些耗时的操作,可能会遇到加班等问题,比如IO堵塞,HTTP请求得不到响应,导致timeout的结果。 可以想出一个解决方案:不加时返回正常结果,加时返回默认结果或特殊处理结果。 JDK中有这样的解决方案。
MyTask.javapackage cn.pangpython.test.utils;import java.util.Random;import java.util.concurrent.*;/** * Created by pangPython on 2017/9/21. */public class MyTask { //设置超时间 private int timeout; public MyTask(int timeout) { this.timeout = timeout; } //处理我的任务 public String handler(){ String result = "-1"; ExecutorService executorService = Executors.newCachedThreadPool(); FutureTask<String> futureTask = new FutureTask<String>(new Callable<String>() { @Override public String call() throws Exception { /** * 这里可以做一些耗时的操作或发送http等等,有可能导致任务超时 * */ Random random = new Random(); int random_num = Math.abs(random.nextInt())%4000; System.out.println("random_num: "+random_num); Thread.sleep(random_num); return Integer.toString(random_num); } }); //执行 executorService.execute(futureTask); try { //获取结果 result = futureTask.get(timeout,TimeUnit.MILLISECONDS); } catch (InterruptedException e) { //如果中断 System.out.println("InterruptedException"); futureTask.cancel(true); } catch (ExecutionException e) { // 若执行异常 System.out.println("ExecutionException"); futureTask.cancel(true); } catch (TimeoutException t){ //如果超时 System.out.println("time out!"); result = "0"; futureTask.cancel(true); } finally { //关闭 executorService.shutdown(); } return result; } public static void main(String[] args){ //声明并实例化自己的任务,设置超时时间为3秒 MyTask myTask = new MyTask(3000); 如果休眠时间超过3000,//循环5次,测试,每次使用的随机数量在4000范围内,将进入超时处理逻辑 String result; for(int i = 0;i<5;i++){ System.out.println(=======第”+i+"次======="); result = myTask.handler(); System.out.println(result); } }}
测试效果
本文是转载内容,我们尊重原作者对文章的权利。如有内容错误或侵权行为,请联系我们更正或删除文章。