关闭

控制Java线程超时后中止的方案

发表于:2013-4-08 09:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:糗事一大把    来源:51Testing软件测试网采编

  这里使用JDK5+的java.util.concurrent包下的API实现,采用这种方式是相对比较安全的。

  实现效果:

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

  代码实现:

  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!

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号