`

JAVA 使用多线程实现超时控制

阅读更多

实现描述:使用一个守护线程作为计时器,并且在计时结束时抛出一个未检测异常。

 

守护线程类

   /**
  * 本线程设置了一个超时时间
  * 该线程开始运行后,经过指定超时时间,
  * 该线程会抛出一个未检查异常通知调用该线程的程序超时
  * 在超时结束前可以调用该类的cancel方法取消计时
  */
  public class TimeoutThread extends Thread{
      // 计时器超时时间
      private long timeout;
      // 计时是否被取消
      private boolean isCanceled = false;
      // 当计时器超时时抛出的异常
      private TimeoutException timeoutException;
      public TimeoutThread(long timeout,TimeoutException timeoutErr) {
          super();
          this.timeout = timeout;
          this.timeoutException = timeoutErr;
          //设置本线程为守护线程
          this.setDaemon(true);
      }
      /**
       * 取消计时
       */
      public synchronized void cancel() {
          isCanceled = true;
      }
      /**
       * 启动超时计时器
       */
      public void run() {
          try {
              Thread.sleep(timeout);
              if(!isCanceled)
                  throw timeoutException;
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
  }

 
抛出异常类

该类继承了RuntimeException,原因是run方法不能抛出已检测异常。

public class TimeoutException extends RuntimeException {
  /**
  * 序列化号
  */
  private static final long serialVersionUID = -8078853655388692688L;
  public TimeoutException(String errMessage) {
      super(errMessage);
  }
}

 

  // 初始化超时类
  TimeoutThread t = new TimeoutThread(5000, new TimeoutException("超时"));
  try {
      t.start();
      .....要检测超时的程序段....
      t.cancel();
  } catch (TimeoutException e) {
      ...对超时的处理...
  }

本方法的使用可以实现线程自己管理超时,并且可以管理某一段代码超时时,可以在方法内部给出处理办法。
但是需要注意的是:本方法的超时时间并不是当前线程的运行时间,而是计时器开始计时起系统运行的时间。

java中有自带API可以实现超时线程控制:Callable, Future

 

分享到:
评论

相关推荐

    java通过线程控制程序执行超时

    java通过线程控制程序执行超时,多线程,反射

    Java线程超时监控

    讲解有关Java中多线程运行时针对单个线程的执行超时监控机制,用于处理单个线程执行控制

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    java多线程URL方式下载单个大文件

    Java代码,根据URL方式下载单个文件或者图片,根据文件大小进行分批启动多线程下载!

    BlockingQueue队列自定义超时时间取消线程池任务

    定义全局线程池,将用户的请求放入自定义队列中,排队等候线程调用,等待超时则自动取消该任务,实现超时可取消的异步任务

    浅谈java中异步多线程超时导致的服务异常

    下面小编就为大家带来一篇浅谈java中异步多线程超时导致的服务异常。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    多线程相关面试问题.docx

    多线程编程是 Java 编程中一个非常重要的概念,它可以提高程序的执行效率和响应速度。然而,多线程编程也存在一些挑战,如线程安全、死锁、线程同步等问题。下面我们将对多线程相关面试问题进行总结和解释。 一、...

    Java同步线程模型分析与改进

    该文针对Java同步线程模型的缺陷,扩展synchronisedA键字语法,使它支持多个参数和能接受一个超时说明

    多线程编程的核心思想.doc

    多线程编程的核心思想 多线程编程的核心思想是指在多线程环境下如何实现线程安全、...多线程编程的核心思想是通过 Lock 和 Condition 接口来实现线程安全和同步机制,并使用 AQS 底层实现来实现锁和 Condition 接口。

    详解Android使用OKHttp3实现下载(断点续传、显示进度)

    我们会用到OKHttp3来做网络请求,使用RxJava来实现线程的切换,并且开启Java8来启用Lambda表达式,毕竟RxJava实现线程切换非常方便,而且数据流的形式也非常舒服,同时Lambda和RxJava配合食用味道更佳 打开我们的app ...

    java开源包4

    Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 Java...

    Java高级工程师面试宝典

    Java 高级工程师面试宝典 - 多线程编程 Java 高级工程师面试宝典中,多线程编程是 Java 程序员面试的重要考点,本文将对 Java 多线程编程的基本概念、线程安全、同步、锁、死锁、等进行详细介绍。 一、进程和线程 ...

    java开源包3

    Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 Java...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java开源包8

    Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 Java...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    google,baidu,bing网页搜索(java实现)

    程序采用多线程(不超过20个,保证不影响其他程序)和超时设置(默认10秒),自己觉得挺好用的。 包括google网页搜索(GoogleQuery.java) baidu网页搜索(BaiduQuery.java) bing网页搜索(BingQuery.java) 三种...

    java开源包11

    Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 Java...

Global site tag (gtag.js) - Google Analytics