`

Java线程超时控制的实现

阅读更多

一.何时需要超时控制

  超时控制一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序超时后, 往往需要进行一些操作,比如退出线程,或者重新执行.

  二.实现方法

  方法1

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

  具体实现:

  类1:守护线程类

/**
  * 本线程设置了一个超时时间
  * 该线程开始运行后,经过指定超时时间,
  * 该线程会抛出一个未检查异常通知调用该线程的程序超时
  * 在超时结束前可以调用该类的cancel方法取消计时
  * @author solonote
  */
  public class TimeoutThread extends Thread{
  /**
  * 计时器超时时间
  */
  private long timeout;
  /**
  * 计时是否被取消
  */
  private boolean isCanceled = false;
  /**
  * 当计时器超时时抛出的异常
  */
  private TimeoutException timeoutException;
  /**
  * 构造器
  * @param timeout 指定超时的时间
  */
  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();
  }
  }
  }
  注: 类一中的TimeoutException是下边的用户自定义类,不是java中的java.util.concurrent.TimeoutException

  类2.抛出异常类,该类继承了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)
  {
  ...对超时的处理...
  }
 TimeoutException可以更换为其他未检查异常类。

  方法说明:

  本方法的使用可以实现线程自己管理超时,并且可以管理某一段代码超时时,可以在方法内部给出处理办法。

  但是需要注意的是:本方法的超时时间并不是当前线程的运行时间,而是计时器开始计时起系统运行的时间。

  方法2:

  是用join方法,在外部管理线程超时。Thread对象有一个join(long millis)方法,执行该方法时如果另一个线程中断了当前线程,就会抛出一个InterruptedException异常。可以采用这个机制在一个线程的外部处理这个线程的异常。我觉得这个方法很有局限性,因为是在外部定义该线程的方法,就只能对整个线程的run方法做出线程超时控制,而并不是对run方法中的某一段代码。并且该方法处理线程超时的处理方法也只能写在线程的外部。不过这个方法的超时定义是当前线程的运行时间。

分享到:
评论

相关推荐

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

    java通过线程控制程序执行超时(新) 基本数据类型 反射 线程 超时

    Java线程超时监控

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

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

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

    线程超时死掉

    Future接口是Java线程Future模式的实 现,可以来进行异步计算。 Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便...

    Java中实现线程的超时中断方法实例

    之前在使用Java实现熔断降级组件的时候,需要实现接口请求的超时中断,通过查找相关资料了解了相关的方法,下面这篇文章主要给大家介绍了关于Java中实现线程的超时中断的相关资料,需要的朋友可以参考下

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

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

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

    目前普遍采用急救包(Band-Aid)类库的方式解决Java 线程模型存在的同步问题,但类库中的代码很难或无法实 ...通过扩展语法方法解决了同步问题,以确保使用Java线程所开发的 程序的稳定、可靠和可优化。

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

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

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

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

    Java HttpURLConnection超时和IO异常处理

    主要介绍了Java HttpURLConnection超时和IO异常处理的相关资料,需要的朋友可以参考下

    安卓,Android线程网络超时自动终止

    Android开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下后台线程往往得不到关闭,浪费系统资源。 在下面的例子中使用了java 中的Timer类,对线程进行了约束,...

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

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

    浅谈Java线程间通信之wait/notify

    下面小编就为大家带来一篇浅谈Java线程间通信之wait/notify。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java开源包4

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

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

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    java开源包3

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

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

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    Java中停止线程执行的方法

    尽管可以在等待wait()条件那里放一个超时设置,但等待wait()的设计目的不是这样的,等待wait()在设计上是用于Java线程间的通信。 而使用睡眠sleep()方式,可以让线程从当前开始睡眠指定的时间。注意不要使用睡眠...

Global site tag (gtag.js) - Google Analytics