zoukankan      html  css  js  c++  java
  • 控制Java线程超时后中止的方案

          广州疯狂软件学院拥有三大课程体系包括: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(" taskResult : " + 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楼。

  • 相关阅读:
    [20190507]sga_target=0注意修改_kghdsidx_count设置.txt
    进程与线程的区别和联系
    html option选中 回显 取值
    application.properties详解 --springBoot配置文件
    Address already in use: JVM_Bind:8080错误的解决办法
    垃圾回收监视和分析
    垃圾回收器种类
    Java垃圾回收是如何工作的?
    Java垃圾回收简介
    关于堆栈的详细讲解
  • 原文地址:https://www.cnblogs.com/gojava/p/3464923.html
Copyright © 2011-2022 走看看