`
ljz0898
  • 浏览: 222239 次
  • 性别: Icon_minigender_1
  • 来自: 海南海口
社区版块
存档分类
最新评论

多线程超时处理的方法

阅读更多
package cn.mytest;

import java.util.ArrayList; 
import java.util.HashMap; 
 
 
/**  
* @Description: 线程监控超时的工具类
* @author
* @date 2014-9-18 下午04:47:12
*/
public class ThreadWathcher extends Thread { 
 
 
    private static ThreadWathcher watcher; 
   
    /**
     * 存放对应的线程跟开始执行的时间
     */
    private HashMap<Thread, Long> threadBornTimeCollection;
   
    /**
     * 需要被中断的线程
     */
    private ArrayList<Thread> toRemoveThreads; 
    /**
     * 超时时间
     */
    private long timeOutMills;
    /**
     * 间隔扫描时间
     */
    private long periodMills; 
 
 
    private ThreadWathcher() { 
    /**
    * 设置线程为守护线程 以致主线程停止的时候守护线程也自动终止
    */
        this.setDaemon(true); 
        threadBornTimeCollection = new HashMap<Thread, Long>(); 
        toRemoveThreads = new ArrayList<Thread>(); 
    } 
 
    /**
     * 配置的超时时间必须是间隔检测时间的倍数+3  比如超时时间是1000则 period应该是503
     * @param timeout
     * @param period
     * @return
     */
    public static ThreadWathcher getInstance(long timeout, long period) { 

        if (watcher == null) { 
            watcher = new ThreadWathcher(); 
            watcher.timeOutMills = timeout; 
            watcher.periodMills = period; 
        } 
 
        return watcher; 
    } 
 
 
    public int register(Thread thread) { 
 
        threadBornTimeCollection.put(thread, System.currentTimeMillis()); 

        return threadBornTimeCollection.size(); 
    } 
 
 
    @Override 
    public void run() { 
        super.run(); 
   
        while (true) {// 守护线程 
            try { 
                Thread.sleep(periodMills);// 每隔periodMills秒检查一次 
                for (Thread e : threadBornTimeCollection.keySet()) {// 遍历已经注册过超时处理的线程集合
                    if (Math.abs(threadBornTimeCollection.get(e) 
                            - System.currentTimeMillis()) > timeOutMills 
                            && e.isAlive()) {// 超时 
                        toRemoveThreads.add(e);// 添加到超時线程集合中 
                    } 
                } 
                for (Thread e : toRemoveThreads) {// 遍历超时线程集合 
                    threadBornTimeCollection.remove(e);// 从超时集合中移除 
                    e.interrupt();// 中断超时线程 
                } 
               
 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } finally { 
                if (toRemoveThreads.size() > 0) { 
                    System.out.println("清空超时线程集合"); 
                    toRemoveThreads.clear();// 清空超时线程集合 
                } 
            } 
        } 
    } 









package cn.mytest;

import java.util.ArrayList;
import java.util.HashMap;

public class Main { 
 
 
    /**
     * @param args
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        System.out.println("Begin here..."); 
       
        ThreadWathcher wacher = ThreadWathcher.getInstance(1000, 503); 
        wacher.start(); 
        Thread a = new Thread() { 
 
            @Override 
            public void run() { 
                super.run(); 
                int n = 0; 
                try { 
                System.out.println("A线程执行中-----");
                Thread.sleep(1100);
                System.out.println("A线程执行完成.....");
                   /* while (n < 1 && !Thread.interrupted()) { 
                        Thread.sleep(1000); 
                        n++; 
                        System.out.println("In thread a..." + n); 
                    }  */
                } catch (InterruptedException e) { 
                    // TODO Auto-generated catch block 
                    System.out.println("线程因超时被终止...线程名" + this.getName()); 
                } 
 
 
            } 
 
 
        }; 
        a.setName("a"); 
        wacher.register(a); 
        a.start(); 
        Thread b = new Thread() { 
 
 
            
           
            @Override 
            public void run() { 
                // TODO Auto-generated method stub 
                super.run(); 
                int n = 0; 
                try { 
                System.out.println("B线程执行中-----");
                Thread.sleep(900);
                System.out.println("B线程执行完成.....");
                   /* while (n < 5 && !Thread.interrupted()) { 
 
 
                        Thread.sleep(1000); 
                        n++; 
                        System.out.println("In thread b..." + n); 
                    }  */
                } catch (InterruptedException e) { 
                    // TODO Auto-generated catch block 
                    System.out.println("线程因超时被终止...线程名" + this.getName()); 
                } 
 
 
            } 
 
 
        }; 
        b.setName("b"); 
        b.start(); 
        wacher.register(b); 
        Thread c = new Thread() { 
 
 
            public void run() { 
                // TODO Auto-generated method stub 
                super.run(); 
                int n = 0; 
                try { 
                System.out.println("C线程执行中-----");
                Thread.sleep(1200);
                System.out.println("C线程执行完成.....");
                   /* while (n < 12 && !Thread.interrupted()) { 
 
 
                        Thread.sleep(1000); 
                        n++; 
                        System.out.println("In thread c..." + n); 
                    }  */
                } catch (InterruptedException e) { 
                    // TODO Auto-generated catch block 
                    System.out.println("线程因超时被终止...线程名" + this.getName()); 
                } 
 
 
            } 
 
 
        }; 
        c.setName("c"); 
        c.start(); 
        wacher.register(c); 
        Thread d = new Thread() { 
 
 
            
            public void run() { 
                // TODO Auto-generated method stub 
                super.run(); 
                int n = 0; 
                try { 
                System.out.println("D线程执行中-----");
                Thread.sleep(500);
                System.out.println("D线程执行完成.....");
                  /*  while (n < 15 && !Thread.interrupted()) { 
 
 
                        Thread.sleep(1000); 
                        n++; 
                        System.out.println("In thread d..." + n); 
                    }  */
                } catch (InterruptedException e) { 
                    // TODO Auto-generated catch block 
                    System.out.println("线程因超时被终止...线程名" + this.getName()); 
                } 
 
 
            } 
 
 
        }; 
        d.setName("d"); 
        d.start(); 
        wacher.register(d); 
       
    } 

 

 
 


分享到:
评论

相关推荐

    C#中的多线程超时处理实践方案

    主要介绍了C#中的多线程超时处理实践方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    .net c#线程超时解决方案

    .net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...

    Java线程超时监控

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

    多线程管理框架支持超时退出任务回调处理

    作用:模仿线程池操作,管理多线程任务,超时,以及完成任务的回调。如果有bug自行处理,服务器挂机一天跑了三千万个线程投递没有出现什么异常。资源作者:。流云思水。资源界面:。资源下载:。

    线程超时死掉

    V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类...

    qtconcurrent 多线程并发处理

    qtconcurrent 多线程并发处理应用demo。开发环境Qt5.9.4

    基于boost::asio的http server3修改的echo服务器,有多线程,多侦听端口,超时处理等

    基于boost::asio的http server3修改的echo服务器,有多线程,多侦听端口,超时处理等

    使用QNetworkAssessManager下载文件,支持断点续传和超时处理

    1.下载进度条展示,支持暂停,停止功能 2.显示下载/剩余大小,剩余时间,下载速度 3.多线程下载,不阻塞界面线程 4.文件断点续传下载 5.下载请求超时的处理 环境VS2015 + win10 64位

    C++封装类CWSocket(多线程 非阻塞)

    C++封装类CWSocket(多线程 非阻塞)vc mfc 一般直接添加就可用,还有超时处理,强大。

    .net 等待超时处理的demo

    .怎么删掉啊,这个demo有点问题 新的版本请见blog: blog.csdn.net/fuadam

    C#基于异步事件回调多线程容器

    多线程应该采用消息中心来交换数据,这样就规避了线程同步交互,等待,阻塞等等,全部是异步调用,全部是接收消息工作,然后产生消息,线程间没有耦合,消息中心有很多成熟的方案如RabbitMQ, Redis(里面有简单的...

    PyQt5中多线程模块QThread和线程池ThreadPoolExecutor解决PyQt5界面程序执行比较耗时操作无响应问题

    1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题,采用线程池ThreadPoolExecutor解决了ping多个IP多任务耗时问题。...

    线程任务后台处理

    大数据保存时会存在线程等待,只有全部保存后才能往下执行,使用线程委托任务让流程先走完,数据慢慢保存,提高页面响应速度

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

    4)终止多线程程序的两种方式(轮询访问变量和interrupt方法) 23 四Concurrent包详解 25 1)Executor接口 25 2)ExecutorService接口 27 3)Callable对象 28 4)Executors工厂类 29 5)使用ExecutorService的例子 30 6)...

    多线程代码测试DSL框架Awaitility.zip

    Awaitility 是多线程代码测试 DSL 框架,用于同步异步操作。测试异步系统很难,它不仅需要处理线程,超时和并发问题,代码测试意图也需在此类细节下隐藏。但 Awaitility 可让您简明传达对异步系统的期望,且操作...

    一个基于IO::Poll和threads多线程的Echo服务程序

    ###################################################################### 下面的程序是一个基于IO::Poll和threads多线程的Echo服务程序,### 在这个程序中实现了对于Dos方式攻击的防御以及对连接超时的处理#######...

    Go语言如何并发超时处理详解

    并发一个函数,等待1s后向timeout写入数据,在select中如果1s之内有数据向其他channel写入则会顺利执行,如果没有,这是timeout写入了数据,则我们知道超时了。 实现代码: package main import fmt import time ...

    pebble:多线程和处理糖果

    result () # blocks until results are ready 以十秒的超时时间运行一个函数并处理错误。 from pebble import concurrentfrom concurrent . futures import TimeoutError@ concurrent . process

    易语言-易语言多线程防崩溃例程

    2、用于改动核心程序就可用于自己的功能,多线程控制模块已经测试好 3、保证有任务时启用的线程处于工作状态,完成任务的线程会自动分配的新的任务,不用等待其他线程 4、可以结束超时的任务,并且设定重试次数 5、...

Global site tag (gtag.js) - Google Analytics