首页 | 联系我们 | 叶凡网络官方QQ群:323842844
游客,欢迎您! 请登录 免费注册 忘记密码
您所在的位置:首页 > 新闻中心 > 行业新闻 > 正文

名扬互联!控制Java线程超时后中止的方案

作者:cocomyyz 来源: 日期:2013-12-3 9:37:56 人气:0 加入收藏 评论:0 标签:

实现效果:

启动一个任务,然后等待任务的计算结果同时设定一个超时时间,如果等待时间超出预设定的超时时间,则中止任务。

代码实现:

  1. import java.util.concurrent.Callable;    

  2. import java.util.concurrent.ExecutionException;    

  3. import java.util.concurrent.ExecutorService;    

  4. import java.util.concurrent.Executors;    

  5. import java.util.concurrent.Future;    

  6. import java.util.concurrent.TimeUnit;    

  7. import java.util.concurrent.TimeoutException;    

  8.    

  9. /**  

  10. * 启动一个任务,然后等待任务的计算结果,如果等待时间超出预设定的超时时间,则中止任务。  

  11. *  

  12. * @author Chen Feng  

  13. */    

  14. public class TaskTimeoutDemo {    

  15.    

  16.    public static void main(String[] args) {    

  17.        System.out.println("Start ...");    

  18.    

  19.        ExecutorService exec = Executors.newCachedThreadPool();    

  20.            

  21.        testTask(exec, 15); // 任务成功结束后等待计算结果,不需要等到15秒  

  22.        testTask(exec, 5); // 只等待5秒,任务还没结束,所以将任务中止  

  23.    

  24.        exec.shutdown();    

  25.        System.out.println("End!");    

  26.    }    

  27.    

  28.    public static void testTask(ExecutorService exec, int timeout) {    

  29.        MyTask task = new MyTask();    

  30.        Future<Boolean> future = exec.submit(task);    

  31.        Boolean taskResult = null;    

  32.        String failReason = null;    

  33.        try {    

  34.            // 等待计算结果,最长等待timeout秒,timeout秒后中止任务  

  35.            taskResult = future.get(timeout, TimeUnit.SECONDS);    

  36.        } catch (InterruptedException e) {    

  37.            failReason = "主线程在等待计算结果时被中断!";    

  38.        } catch (ExecutionException e) {    

  39.            failReason = "主线程等待计算结果,但计算抛出异常!";    

  40.        } catch (TimeoutException e) {    

  41.            failReason = "主线程等待计算结果超时,因此中断任务线程!";    

  42.            exec.shutdownNow();    

  43.        }    

  44.    

  45.        System.out.println("\ntaskResult : " + taskResult);    

  46.       System.out.println("failReason : " + failReason);    

  47.    }    

  48. }    

  49.    

  50. class MyTask implements Callable<Boolean> {    

  51.    

  52.    @Override    

  53.    public Boolean call() throws Exception {    

  54.        // 总计耗时约10秒  

  55.        for (int i = 0; i < 100L; i++) {    

  56.            Thread.sleep(100); // 睡眠0.1秒  

  57.            System.out.print('-');    

  58.        }    

  59.        return Boolean.TRUE;    

  60.    }    

  61. }    

运行结果:

  1. Start ...    

  2. ----------------------------------------------------------------------------------------------------    

  3. taskResult : true    

  4. failReason : null    

  5. ---------------------------------------------    

  6. taskResult : null    

  7. failReason : 主线程等待计算结果超时,因此中断任务线程!    

  8. End!  


本文网址:http://www.mingyangnet.com/html/hangye/1193.html
读完这篇文章后,您心情如何?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
更多>>网友评论
发表评论
编辑推荐
  • 没有资料