`
jomper
  • 浏览: 38031 次
  • 性别: Icon_minigender_1
  • 来自: 湖北-武汉
社区版块
存档分类
最新评论

线程监视器

    博客分类:
  • Java
阅读更多
大家都知道线程是不可靠的,我想了一些办法去监视线程当前的运行状态,能得到比如该线程到了那个类的那个方法了,到了哪一行了,在细粒度的控制上还是有一定作用的。

之前去实现jdk里的Observer接口写了一个,但是发现 实际上还是由线程自己触发内部的event后,listener才能响应,一旦线程阻塞,没有event了,listener也没有意义了。这样始终是被动得到线程发出的信息。

想要主动的获得线程的运行信息,需要一个timer 定时去主动获取它的状态,也就是获得当前线程对象的方法堆栈。
如果发现目标线程已经结束,则关闭监视器。如果因为发生预期外的阻塞而timeout,也关闭监视器,由于已经将目标线程设置成deamon,目标线程也将结束。
这样能完全掌握目标线程的一举一动,不听话就干掉。是不是很有快感?

ThreadMonitor使用办法
ThreadMonitor thread = new ThreadMonitor(new OneThread(),5000,1000);
thread.start();


ThreadMonitor:
public class ThreadMonitor {
	private Thread thread;
	private Timer timer = new Timer();
	private long period,timeout,startTime;
	private boolean isFirst;
	
	public ThreadMonitor(Thread thread,long timeout,long period){
		this.thread = thread;
		init(timeout, period);
	}
	
	public ThreadMonitor(Runnable runnable,long timeout,long period){
		thread = new Thread(runnable);
		init(timeout, period);
	}
	
	private void init(long timeout,long period){
		isFirst = true;
		this.period = period;
		this.timeout = timeout;
		startTime = System.currentTimeMillis();
	}
	
	public void start(){
		timer.schedule(new TimerTask(){
			public void run() {
				if(isFirst)
					thread.setDaemon(true);
				boolean isTimeout = System.currentTimeMillis() - startTime>timeout;
				if(!isFirst && (isTimeout || !thread.isAlive())){
					timer.cancel();
					if(!isTimeout && !thread.isAlive())
						System.out.println("Thread is over");
					if(isTimeout)
						System.out.println("Timeout");
					if(!thread.isAlive())
						System.out.println("Close target thread");
					System.out.println("Close thread monitor");
				}else {
					long now = System.currentTimeMillis();
					StackTraceElement elements[] = thread.getStackTrace();
					if(elements.length >0)
						for(StackTraceElement element : elements){
							System.out.println("["+(now-startTime)+"] Current: "+ element.getClassName()+" " +element.getMethodName()+"() line:"+element.getLineNumber());
						}
					else
						System.out.println("Stack is null");
				}
				isFirst = false;
			}
		}, 0, period);
		thread.start();
	}
}


下面是例子
OneThread:
public class OneThread implements Runnable {
	public void run() {
		ThreadUtil util = new ThreadUtil();
		util.step1();
		util.step2();
		util.step3();
	}
}


ThreadUtil:
public class ThreadUtil {
	public void step1(){
		synchronized(this){
			try {
				wait(1000);
			} catch (InterruptedException e) {
				System.out.println("1:"+e.getMessage());
			}
		}
	System.out.println("step1 finished");
	}
	public void step2(){
		synchronized(this){
			try {
				wait(3000);
			} catch (InterruptedException e) {
				System.out.println("3:"+e.getMessage());
			}
		}
	System.out.println("step3 finished");
	}
	public void step3(){
		synchronized(this){
			try {
				wait(2000);
			} catch (InterruptedException e) {
				System.out.println("3:"+e.getMessage());
			}
		}
	System.out.println("step3 finished");
	}
}


下面是输出:
Stack is null
[1002] Current: java.lang.Object wait() line:-2
[1002] Current: org.jomper.test.thread.ThreadUtil step1() line:7
[1002] Current: org.jomper.test.thread.OneThread run() line:7
[1002] Current: java.lang.Thread run() line:595
step1 finished
[2006] Current: java.lang.Object wait() line:-2
[2006] Current: org.jomper.test.thread.ThreadUtil step2() line:17
[2006] Current: org.jomper.test.thread.OneThread run() line:8
[2006] Current: java.lang.Thread run() line:595
[3010] Current: java.lang.Object wait() line:-2
[3010] Current: org.jomper.test.thread.ThreadUtil step2() line:17
[3010] Current: org.jomper.test.thread.OneThread run() line:8
[3010] Current: java.lang.Thread run() line:595
step2 finished
[4010] Current: java.lang.Object wait() line:-2
[4010] Current: org.jomper.test.thread.ThreadUtil step3() line:27
[4010] Current: org.jomper.test.thread.OneThread run() line:9
[4010] Current: java.lang.Thread run() line:595
Timeout
Close thread monitor


大家来讨论把,还有没有更好的办法,或者思路上有没有问题,有没有想错的地方。
分享到:
评论
4 楼 sdh5724 2009-01-19  
谁说线程不可靠?自己做POOL还是有不少要求而已。异常的处理非常重要, 如果一直扔出去, 那么线程自然就自动退出了。 实际上, 即使监控到线程被LOCK,或者挂住, 监控也是无能为力的。因此还是需要仔细设计好为上策。
3 楼 galaxystar 2009-01-19  
threadDump?
2 楼 littcai 2009-01-19  
通过thread.isAlive()获取线程状态依然存在同步问题
1 楼 jomper 2008-02-20  
我犯了一个错误,之前把thread.setDaemon(true);  方到TimeTask之外了.成了主线程不消亡target thread就不消亡,我并没有干掉target thread!

现在我把他放到TimeTask里,从输出里可以看到,target thread的确是已经终止了。System.out.println("step3 finished");  并没有输出。

现在有一种办法是在 target thread 内部设置 标志位,然后double check.来终止线程内部流程而使 target thread 终止。
public void run(){
    while(!isInterrupted){
    //todo process
    }
}
这样安全,但是这样就有入侵.

把target thread 设置成守护线程,通过主线程的可控性终止来间接实现 target thread的终止,这是不是也是一种思路呢?

相关推荐

    10.3_C#多线程监视器程序

    "10.3_C#多线程监视器程序"可能是一个示例项目,旨在教授如何在C#环境中管理和监控多个并发线程。让我们深入探讨一下这个主题,了解多线程的核心概念以及在C#中如何使用它们。 首先,多线程允许一个应用程序同时...

    编写进程/线程监视器

    ### 编写进程/线程监视器:深入解析与实现 在计算机系统中,进程与线程是操作系统管理和调度的基本单位。为了深入了解系统的运行状态,尤其是监控特定进程或线程的创建、销毁以及加载模块等行为,开发一个进程/线程...

    thread-monitor:线程监视器桌面 Java 应用程序

    线程监视器是一款非常重要的工具,特别是在Java编程环境中,它能帮助开发者监控应用程序中的线程状态,以便诊断和解决性能问题、死锁或其他并发问题。本文将深入探讨Java线程监视器的应用及其重要性,以及如何利用...

    C#多线程监视器程序

    摘要:C#源码,系统相关,多线程,监视器 一个适合初学者参考学习的C#多线程监视器程序,创建3个线程,模拟多线程运行,并绑定TestRun方法,定义线程的绑定方法,在同步对象上获取排他锁,模拟做一些耗时的工作。

    另一个线程监视器

    标题中的“另一个线程监视器”(Yet Another Thread Monitor)显然指的是一个专门用于监测和管理线程的工具或软件。线程是操作系统中并行执行的最小单元,它允许程序在单个进程中同时进行多个任务。线程监视器能够...

    cmc-monitor:线程监视器,用于从CMTS获取电缆调制解调器和上行通道,并同步到数据库

    《线程监视器在CMTS数据管理中的应用——以cmc-monitor为例》 在现代通信技术中,CMTS(Cable Modem Termination System)是实现有线电视网络与互联网连接的关键设备,它负责管理和控制电缆调制解调器(Cable ...

    安全稳定的实现进线程监控.zip_MyCopyHook.rar_create process_sys文件_监视 进程_驱动进程监

    用PsSetCreateProcessNotifyRoutine,PsSetCreateThreadNotifyRoutine来进行进程线程监控我想大家已经都非常熟练了.sinister在编写进程/线程监视器>>一文中已经实现得很好了.前一段时间看到网上有人在研究监视远线程...

    面试中多线程问题

    "面试中多线程问题" 多线程是 Java 编程中一个重要...同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。

    Java 线程图形化理解

    打开这个JAR文件,你将能看到一个线程监视器,它可能提供了以下功能: 1. **实时线程视图**:列出所有活动线程并显示其状态。 2. **线程堆栈跟踪**:点击线程可以查看其当前执行的代码行和方法调用栈。 3. **线程...

    procmon_进程监视_

    4. **ThreadMonitor.cpp**:线程监视器是 ProcMon 的核心部分,它持续监控系统中的线程活动,如创建、结束、挂起和恢复。这通常涉及到Windows的线程管理和事件通知机制。 5. **NtDriverController.cpp**:NT驱动...

    监视系列 -- 进程监视器

    【进程监视器】是系统监控领域的一个重要工具,主要用于详细追踪和记录系统中各个进程的活动。这个工具能够提供深入的洞察力,帮助用户了解系统内部的运行情况,包括文件、注册表、网络以及内存等资源的访问行为。在...

    JConsole工具使用

    2. **线程监视器**:显示当前运行的线程信息,包括线程状态(如运行、阻塞、等待等)和CPU占用情况,有助于定位线程死锁或过度竞争的问题。 3. **类加载器监视器**:监控类的加载、卸载和使用情况,有助于理解类的...

    TCP监视器增强版

    《TCP监视器增强版》是一款专门用于监测网络中TCP连接状态的强大工具,它为用户提供了一个深入洞察TCP连接细节的窗口,对于系统管理员、网络工程师以及软件开发者来说,是一款不可或缺的辅助工具。通过这款软件,...

    线程同步Synchronized,监视器monitor和锁lock的关系1---马克-to-win java视频

    线程同步Synchronized,监视器monitor和锁lock的关系1---马克-to-win java视频

    进程监视器下载进程监视器

    1. **实时监控**:进程监视器可以实时显示系统中所有进程的详细信息,包括进程ID、CPU使用率、内存使用、线程、模块、网络流量等。 2. **过滤和筛选**:用户可以根据特定条件(如进程名、事件类型、路径、结果等)...

    线程同步Synchronized,监视器monitor和锁lock的关系3---马克-to-win java视频

    线程同步Synchronized,监视器monitor和锁lock的关系2---马克-to-win java视频

    易语言创建监视器

    易语言创建监视器源码,创建监视器,过滤q,目录变更处理,托盘事件,sfdza,近似值,验证,监视目录,停止监视,线程_停止监视吧,线程_监视文件更变,线程_文件更变处理,UnicodeToAnsi_Ptr,API_取得Win目录,目录是否存在,启动...

    文件系统监视器

    文件系统监视器是一种实用工具,专门设计用于跟踪和记录文件系统的任何变化或活动。它能够帮助用户深入了解系统中发生的文件操作,例如创建、修改、删除、读取和写入等事件,这对于系统管理员、开发者以及故障排查...

    windows的进程监视器

    Windows的进程监视器,通常被称为Process Monitor(进程监视器),是微软系统工具中的一款强大工具,主要用于实时监控系统中的各种进程活动。它提供了一个详细、深入的视图,揭示了系统内部发生的各种事件,包括文件...

Global site tag (gtag.js) - Google Analytics