精华内容
下载资源
问答
  •  * 该线程开始运行后,经过指定超时时间,  * 该线程会抛出一个未检查异常通知调用该线程的程序超时  * 在超时结束前可以调用该类的cancel方法取消计时  */  public class TimeoutThread ext...

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

     

    守护线程类

       /**
      * 本线程设置了一个超时时间
      * 该线程开始运行后,经过指定超时时间,
      * 该线程会抛出一个未检查异常通知调用该线程的程序超时
      * 在超时结束前可以调用该类的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线程 超时控制的实现

    千次阅读 2007-10-18 20:13:00
    一.何时需要超时控制超时控制一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序超时...具体实现:类1:守护线程类/** * 本线程设置了一个超时时间 * 该线程开始运行后,经过指定超

    一.何时需要超时控制

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

    二.实现方法

    方法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 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方法中的某一段代码。并且该方法处理线程超时的处理方法也只能写在线程的外部。不过这个方法的超时定义是当前线程的运行时间。

     
    展开全文
  • 必须要用到多线程来监控吗?python有没有内置方法?

    必须要用到多线程来监控吗?python有没有内置方法?

    有的,找到了!

    参考文章:python函数执行超时后跳过

    # -*- encoding: utf-8 -*-
    """
    @File    : 20200310_python_test.py
    @Time    : 2020/3/10 23:29
    @Author  : Dontla
    @Email   : sxana@qq.com
    @Software: PyCharm
    """
    import time
    import eventlet  # 导入eventlet这个模块
    
    eventlet.monkey_patch()  # 必须加这条代码
    with eventlet.Timeout(2, False):  # 设置超时时间为2秒
        print('这条语句正常执行')
        time.sleep(4)
        print('没有跳过这条输出')
    print('跳过了输出')
    
    

    结果:

    D:\20191031_tensorflow_yolov3\python\python.exe D:/old/20200310_python_test/20200310_python_test.py
    这条语句正常执行
    跳过了输出
    
    Process finished with exit code 0
    

    经检验,一切正常!

    也可以套一个try…except,并将Timeout中参数设置为True,这样就能在程序运行时监测异常并在检测到异常后立即对异常进行处理

    # -*- encoding: utf-8 -*-
    """
    @File    : 20200310_python_test.py
    @Time    : 2020/3/10 23:29
    @Author  : Dontla
    @Email   : sxana@qq.com
    @Software: PyCharm
    """
    import time
    import eventlet  # 导入eventlet这个模块
    
    eventlet.monkey_patch()  # 必须加这条代码
    try:
        with eventlet.Timeout(2, False):  # 设置超时时间为2秒
            try:
                time.sleep(4)
                # 该语句正常执行
            except Exception:
                raise
    except Exception:
        print(Exception)
    
    

    好像不行哎,没法正常检测到异常

    这是正常执行,不会报异常的!!

    需要这样,将Timeout()中的参数改为True:

    # -*- encoding: utf-8 -*-
    """
    @File    : 20200310_python_test.py
    @Time    : 2020/3/10 23:29
    @Author  : Dontla
    @Email   : sxana@qq.com
    @Software: PyCharm
    """
    import time
    import eventlet  # 导入eventlet这个模块
    
    eventlet.monkey_patch()  # 必须加这条代码
    try:
        # Dontla 20200421 超时将抛出异常
        with eventlet.Timeout(2, True):  # 设置超时时间为2秒
            time.sleep(4)
        print('程序运行未超时!')
    except eventlet.timeout.Timeout:
        # except:   # (或,两种都行,注意不能用except Exception,因为Exception是异常基类,我们这个超时异常未包含在它里面)
        print('程序运行超时!')
    
    

    运行结果:

    程序运行超时!
    
    # -*- encoding: utf-8 -*-
    """
    @File    : 20200310_python_test.py
    @Time    : 2020/3/10 23:29
    @Author  : Dontla
    @Email   : sxana@qq.com
    @Software: PyCharm
    """
    import time
    import eventlet  # 导入eventlet这个模块
    
    eventlet.monkey_patch()  # 必须加这条代码
    try:
        # Dontla 20200421 超时将抛出异常
        with eventlet.Timeout(5, True):  # 设置超时时间为5秒
            time.sleep(4)
        print('程序运行未超时!')
    except eventlet.timeout.Timeout:
        # except:   # (或,两种都行,注意不嫩用except Exception,因为Exception是异常基类,我们这个超时异常未包含在它里面)
        print('程序运行超时!')
    
    

    运行结果:

    程序运行未超时!
    

    参考文章:python异常类型(Exception只是常规错误的基类)

    展开全文
  • Java中线程状态:新建(New)、可运行(Runnable)、等待(Wating)、超时等待(Timed_Wating)、阻塞(Blocked)、Terminated(终止)。所有状态在Thread.state枚举类中。 状态转换图: 当线程中互相等待对方...

    #java线程死锁的检测方法

    Java中线程状态:新建(New)、可运行(Runnable)、等待(Wating)、超时等待(Timed_Wating)、阻塞(Blocked)、Terminated(终止)。所有状态在Thread.state枚举类中。

    状态转换图:
    当线程中互相等待对方释放锁的时候就会都变成Blocked状态形成死锁,产生死锁的必要条件: **1. 互斥条件:**一个资源每次只能被一个进程使用。 **2. 请求与保持条件:**一个进程因请求资源而阻塞时,对已获得的资源保持不放。 **3. 不剥夺条件:**进程已获得的资源,在末使用完之前,不能强行剥夺。 **4. 循环等待条件:**若干进程之间形成一种头尾相接的循环等待资源关系。

    例如: 测试threadA和threadB都进入无线等待,形成死锁。 代码如下:

    public class ThreadTest {
    	private static final Object lockA = new Object();
    	private static final Object lockB = new Object();
    
    	public static void main(String[] args) throws Exception {
    		Thread threadA = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				synchronized (lockA) {
    					System.out.println("a thead run ...");
    					try {
    						Thread.sleep(3000);
    					} catch (InterruptedException e) {
    					}
    					synchronized (lockB) {
    						System.out.println("a thead end ...");
    					}
    				}
    			}
    		});
    		threadA.setName("threadA");
    		Thread threadB = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				synchronized (lockB) {
    					System.out.println("b thead run ...");
    					synchronized (lockA) {
    						System.out.println("b thead end ...");
    					}
    				}
    			}
    		});
    		threadB.setName("threadB");
    		threadA.start();
    		Thread.sleep(1000);
    		threadB.start();
    	}
    }
    

    当发生的死锁后,JDK自带了两个工具(jstack和JConsole),也可以使用VisualVm进行监控。

    VisualVm

    VisualVM会看到如下: 通过threadump可以看到更加详细的信息:

    jstack

    通过jstack展示线程堆栈信息(以Windows环境为例) 1.找到运行当前程序的JVM的进程id(测试使用的是eclipse运行,17572pid是eclipse) 2.执行jstack [pid] 这样就能清晰的查出是threadAthreadB线程互相等待产生死锁。推荐将线程命名,这样在线程堆栈dump中就能准确的定位是哪个线程,如果不进行命名将会由系统自动命名,不便于问题的查找。

    工具是如何检测死锁的呢?

    产生死锁也就意味着先生之间的等待关系出现了闭合环路,发生死锁。我们可以将等待关系想象成一个单项链表。那么也就将问题转化为判断这个链表中是否出现环路。如何检测单项链表中是否有闭合环路,请看我的另一片博客。

    转载于:https://my.oschina.net/hongliangsun/blog/1546375

    展开全文
  • 在项目中碰到了一个应用异常,从表象来看应用僵死。查看Weblogic状态为Running,内存无溢出,但是出现多次线程堵塞。...我们知道,Weblogic会自动检测线程运行超时,当超过特点时间(默认600S),即认...
  • 监控线程设计

    千次阅读 2010-01-05 20:00:00
    目的:监控服务中各线程运行状态,防止因为死锁或其它原因导致某些线程不工作,而导致业务不正常 方法:开启1个daemon线程,用于检测线程运行状态 第1步:业务线程启动时,向daemon线程注册第2步:每隔1段...
  • 前几天做的一道线程调度的题目,题目本身的思路很简单,主要是检测数据里面有超时检测数据。下面先贴一下题目要求: 问题描述 进程调度是操作系统设计中非常重要的问题。每个进程都需要一定的资源才能运行,...
  • 1.2 死锁检测与防止 1.3 产生条件 互斥 请求并持有 非剥夺 循环等待 二、线程的状态与转换 NEW:创建 RUNNABLE:可运行 REDAY:就绪态 RUNNING:运行态 BLOCKED:获取锁失败进入BLOCKED状态,获取锁...
  • 10. GUI 编码阶段 遇到的问题: (1)线程间同步 计时器需要新建线程,才能避免主界面函数停止响应。但是在跳到下一道题时候,在新建线程的同时...用的是Qt的信号和槽机制,计时器线程运行到函数尾部时,emit一个...
  • C#开发功能包

    2014-03-20 10:37:50
    C#开发通用功能包 7022-IO读写 EXL导出-导入 ini文件读写 MD5加解密 OPC操作 TCP-IP操作 不能同时...方法运行超时检测 各种数据库 截图控件 群发邮件 生成txt日志 委托-递归-回调 文件流压缩 线程操作 自定义控件创建
  • 流光5.0安全绿色版

    2010-08-17 16:24:51
    7、线程超时设置,阻塞线程具有自杀功能,不会影响其他线程。8、支持10个字典同时检测。9、检测设置可作为项目保存。10、取消了国内IP限制而且免费。流光4.7新增功能: 1、加入了本地模式,在本机运行是不必安装...
  • Dubbo服务之优雅停机

    2020-01-13 08:35:54
    服务提供方停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。服务消费方停...
  • Dubbo探索(七)

    2019-10-07 06:03:42
    然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。 服务消费方 停止时,不再发起新的调用请求,所有新的调用在客户端即报错。 然后,检测有没有请求的响应还...
  • ehcache-core-2.5.2

    2015-05-12 09:47:24
    diskExpiryThreadIntervalSeconds:对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。 diskSpoolBufferSizeMB:DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。 ...
  • 大概问题是一个项目运行过程中,突然大量线程被阻塞,导致应用超时无响应(此处省去检测方法,自己搜索,可以参考中间件如tomcat的线程配置、jsack使用) jstack后,如下是大量线程信息,基本所有线程都是如下: ...
  • 最新Shell助手V2019

    2019-01-07 13:37:57
    4、支持多线程线程间隔、执行超时、过滤HTML页面、过滤失败等相关设置。 5、支持百万大数据URL秒级导入不卡,导入数据后可自定义按行号开始执行检测。 6、采用C#开发,完美兼容全系统,运行软件前需要安装.NET ...
  • C#编程:Task的使用

    2021-03-11 21:07:55
    持续功能,C#学习总结汇总线程部分Task的使用Task的说明Task的简单使用Task的超时检测Task的带参数及返回值使用带返回值带一个参数和返回值多个使用和返回值 线程部分 Task的使用 Task的说明 暂时只知道这玩意是实现...
  • 避免死锁

    2018-07-22 16:28:02
    加锁超时后可以先继续运行干点其它事情,再回头来重复之前加锁的逻辑。超时和重试机制是为了避免在同一时间出现的竞争,但当线程过多,同一时间也有可能会出现问题。 3.死锁检测:当请求锁失败...
  • 流光扫描器

    2015-01-15 11:29:21
    7、线程超时设置,阻塞线程具有自杀功能,不会影响其他线程。8、支持10个字典同时检测。9、检测设置可作为项目保存。10、取消了国内IP限制而且免费。 流光4.7新增功能: 1、加入了本地模式,在本机运行是不必安装...
  • 优雅停机

    2018-06-19 17:50:00
    Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果用户使用 kill -9 PID 等强制关闭指令,是不会...然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。 ...
  • dubbo之优雅停机

    2017-09-19 21:26:00
    优雅停机 Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果用户使用kill -9 PID等强制关闭指令,是不会执行...然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强...
  • 7、线程超时设置,阻塞线程具有自杀功能,不会影响其他线程。 8、支持10个字典同时检测。 9、检测设置可作为项目保存。 10、取消了国内IP限制而且免费。、用于检测POP3/FTP主机中用户密码安全漏洞。 2、163/169双通...
  • dubbo优雅停机

    2018-08-01 00:49:38
    dubbo优雅停机 Dubbo是通过JDK的ShutdownHook来完成优雅停机的,所以如果用户使用”kill -9 PID”等强制关闭指令,是不会... 然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则...
  • 7、线程超时设置,阻塞线程具有自杀功能,不会影响其他线程。8、支持10个字典同时检测。9、检测设置可作为项目保存。10、取消了国内IP限制而且免费。 流光4.7新增功能: 1、加入了本地模式,在本机运行是不必安装...
  • 流光 Fluxay v5.0

    2009-02-25 11:46:25
    7、线程超时设置,阻塞线程具有自杀功能,不会影响其他线程。8、支持10个字典同时检测。9、检测设置可作为项目保存。10、取消了国内IP限制而且免费。 流光4.7新增功能: 1、加入了本地模式,在本机运行是不必安装...
  • 调用栈大小限制(即记录自脚本开始以来执行的语句的数量)和长时间运行脚本限制(记录脚本执行的总时长,超时的时候会有弹框提示用户[chrome没有单独的程云霞脚本限制,替代做法是依赖其通用奔溃检测系统来处理此类...
  • 数据库也会发生死锁的现象,数据库系统实现了各种死锁检测和死锁超时机制来解除死锁,锁监视器进行死锁检测,MySQL的InnoDB处理死锁的方式是 将持有最少行级排它锁的事务进行回滚,相对比较简单的死锁回滚办法

空空如也

空空如也

1 2 3 4 5 6
收藏数 112
精华内容 44
关键字:

检测线程运行超时