`
ljz0898
  • 浏览: 225791 次
  • 性别: 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); 
       
    } 

 

 
 


分享到:
评论

相关推荐

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

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

    Java线程超时监控

    另外,`java.lang.Thread`类也提供了一种实现线程超时的方法,通过使用`join`方法。`join`可以等待某个线程结束,同时可以设置一个等待时限。 ```java Thread thread = new Thread(() -&gt; { // 需要监控的线程代码 ...

    libevent多线程处理

    本文将深入探讨如何在多线程环境中使用Libevent进行事件处理,并分享一个基于Libevent的多线程实现案例。 首先,理解Libevent的核心机制至关重要。Libevent提供了一个事件基础结构,它能够将来自不同来源的事件(如...

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

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

    PHP多线程图片处理

    在多线程图片处理中,CURL是关键工具,因为它可以并发地处理多个URL请求,从而提高处理速度。 2. **多线程模拟**:PHP不直接支持多线程,但可以通过pthreads扩展来模拟。pthreads扩展提供了一种在PHP中创建线程、...

    线程超时死掉

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

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

    在Java编程中,控制程序执行超时是一项重要的任务,特别是在多线程环境下,我们可能需要确保某个任务不会无限制地运行下去,导致资源耗尽。本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会...

    WinForm C#多线程等待窗体

    在C#编程中,Windows Forms(WinForm)应用程序经常需要处理多线程操作,以便实现非阻塞用户界面。在标题“WinForm C#多线程等待窗体”中,我们探讨的关键点是如何在进行耗时操作时创建一个等待窗体,让用户知道程序...

    qtconcurrent 多线程并发处理

    在编程领域,多线程并发处理是提升程序执行效率的关键技术之一。Qt库提供了一个强大的模块——qtconcurrent,使得开发者能够轻松地在Qt应用程序中实现多线程并行计算。本文将深入探讨qtconcurrent模块,以及如何在Qt...

    .net 等待超时处理的demo

    在多线程环境中,如果需要确保数据的顺序性,这样的队列可能会用到同步原语如`Monitor`, `Mutex`, 或者`SemaphoreSlim`来控制并发访问,并且可能会结合等待超时处理,以避免线程长时间等待队列的可用性。 博客链接`...

    鱼刺多线程注册源码例子(鱼刺多线程稳定框架)

    3. 错误处理和异常安全:在多线程环境中,需要特别注意异常的处理,确保在出现错误时能够正确地清理资源,避免悬挂的线程。 4. 线程调度和优先级:可能有功能用于设置线程的优先级,以控制它们的执行顺序,或者设置...

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

    在Java编程中,控制程序执行超时是一项关键任务,特别是在多线程环境下,我们需要确保某个任务不会无限期地运行,导致资源浪费或者阻塞其他重要任务。本篇将深入探讨如何利用Java的线程和定时器(Timer)来实现这个...

    易语言多线程访问网页

    这个子程序可能包含了网络请求、数据解析、错误处理等步骤,是多线程访问网页的核心部分。 5. **异步编程**:为了防止主线程被长时间阻塞,多线程访问通常采用异步编程模型。易语言提供了异步调用的机制,如“异步...

    实例讲述多线程的处理机制

    6. **线程安全**:如果一个函数或方法在多线程环境中调用时能正确处理数据一致性问题,那么它就是线程安全的。线程安全编程要求开发者对共享资源的访问进行严格控制,避免出现竞态条件。 7. **线程通信**:线程间...

    C#多线程等待窗体

    在C#编程中,多线程技术是一种常用的方法,它能让我们在单个应用程序中同时执行多个任务,提高程序的效率和响应性。"等待窗体"是多线程应用中一个重要的概念,通常用于在后台任务执行时提供用户友好的界面反馈。本...

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

    《基于Boost.ASIO的HTTP Server3:多线程、多端口与超时处理的Echo服务器实现》 Boost.ASIO是C++库中的一个强大组件,...通过对多线程、多端口监听和超时处理的理解,我们可以更好地理解和构建高性能的网络应用程序。

    Linux系统下的多线程编程入门.pdf

    本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程概念 多线程是指在一个进程中可以同时执行多个独立的代码段,每个代码...

    QT中sqlite多线程操作4个注意问题

    在多线程环境下使用`QsqlQuery`变量时,有时会遇到奇怪的问题,即使按照上述方法进行了处理,程序运行一段时间后仍可能出现数据库死锁或者异常关闭的情况。此时,可以尝试通过限制`QsqlQuery`变量的作用域来改善这一...

    CURL多线程类库

    如果I/O不是瓶颈,那么多线程的优势将会更加明显,因为CPU可以在等待数据传输的同时处理其他请求,从而提高了整体的吞吐量。 内置的7个demo示例可以提供很好的参考,帮助开发者理解如何使用这个类库。这些示例可能...

Global site tag (gtag.js) - Google Analytics