A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© l396262632 中级黑马   /  2013-8-14 11:35  /  1173 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[size=14.44444465637207px]这里使用JDK5+的java.util.concurrent包下的API实现,采用这种方式是相对比较安全的。
[size=14.44444465637207px]实现效果:
[size=14.44444465637207px]启动一个任务,然后等待任务的计算结果同时设定一个超时时间,如果等待时间超出预设定的超时时间,则中止任务。
  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!   
复制代码

点评

技术分不要急 踏踏实实的交流学习问题 自然就有了。技术分不是为了捆绑你来论坛而是想让你和同期的朋友多一些交流  发表于 2013-8-14 14:18

1 个回复

倒序浏览
您需要登录后才可以回帖 登录 | 加入黑马