您的位置:首页 > 编程语言 > Java开发

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

2013-12-09 10:59 267 查看
广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,本月基础强化营(可先就业后付款)火热报名中,欢迎有志之士电话020-28309358或者QQ544627560咨询。

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

  实现效果:

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

  代码实现:

  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.TimeUnit;

  import java.util.concurrent.TimeoutException;

  /**

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

  *

  * @author Chen Feng

  */

  public class TaskTimeoutDemo {

  public static void main(String[] args) {

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

  ExecutorService exec = Executors.newCachedThreadPool();

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

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

  exec.shutdown();

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

  }

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

  MyTask task = new MyTask();

  Future future = exec.submit(task);

  Boolean taskResult = null;

  String failReason = null;

  try {

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

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

  } catch (InterruptedException e) {

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

  } catch (ExecutionException e) {

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

  } catch (TimeoutException e) {

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

  exec.shutdownNow();

  }

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

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

  }

  }

  class MyTask implements Callable {

  @Override

  public Boolean call() throws Exception {

  // 总计耗时约10秒

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

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

  System.out.print('-');

  }

  return Boolean.TRUE;

  }

  }

  运行结果:

  Start ...

  -------------------------------------------------------------------------------------------------

  ---

  taskResult : true

  failReason : null

  ---------------------------------------------

  taskResult : null

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

  End!

  疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。疯狂软件开设了java课程,ios课程,android课程,为你提供一个学习java技能的好机会,疯狂软件特大优惠活动,加疯狂软件微信号(疯狂软件),抢优惠,优惠100元+赠送iOS教材一本 详情请看疯狂java培训官网。IT从业着仍是社会所需要的高端人才,广州疯狂软件之力于培养企业所需要的中高端IT人才,让你成为备受企业青睐的人才。

  疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂java培训中心地址:广州天河区车陂沣宏大厦3楼。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: