大家都知道线程是不可靠的,我想了一些办法去监视线程当前的运行状态,能得到比如该线程到了那个类的那个方法了,到了哪一行了,在细粒度的控制上还是有一定作用的。
之前去实现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
大家来讨论把,还有没有更好的办法,或者思路上有没有问题,有没有想错的地方。
分享到:
相关推荐
"10.3_C#多线程监视器程序"可能是一个示例项目,旨在教授如何在C#环境中管理和监控多个并发线程。让我们深入探讨一下这个主题,了解多线程的核心概念以及在C#中如何使用它们。 首先,多线程允许一个应用程序同时...
### 编写进程/线程监视器:深入解析与实现 在计算机系统中,进程与线程是操作系统管理和调度的基本单位。为了深入了解系统的运行状态,尤其是监控特定进程或线程的创建、销毁以及加载模块等行为,开发一个进程/线程...
线程监视器是一款非常重要的工具,特别是在Java编程环境中,它能帮助开发者监控应用程序中的线程状态,以便诊断和解决性能问题、死锁或其他并发问题。本文将深入探讨Java线程监视器的应用及其重要性,以及如何利用...
摘要:C#源码,系统相关,多线程,监视器 一个适合初学者参考学习的C#多线程监视器程序,创建3个线程,模拟多线程运行,并绑定TestRun方法,定义线程的绑定方法,在同步对象上获取排他锁,模拟做一些耗时的工作。
标题中的“另一个线程监视器”(Yet Another Thread Monitor)显然指的是一个专门用于监测和管理线程的工具或软件。线程是操作系统中并行执行的最小单元,它允许程序在单个进程中同时进行多个任务。线程监视器能够...
《线程监视器在CMTS数据管理中的应用——以cmc-monitor为例》 在现代通信技术中,CMTS(Cable Modem Termination System)是实现有线电视网络与互联网连接的关键设备,它负责管理和控制电缆调制解调器(Cable ...
用PsSetCreateProcessNotifyRoutine,PsSetCreateThreadNotifyRoutine来进行进程线程监控我想大家已经都非常熟练了.sinister在编写进程/线程监视器>>一文中已经实现得很好了.前一段时间看到网上有人在研究监视远线程...
"面试中多线程问题" 多线程是 Java 编程中一个重要...同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。
打开这个JAR文件,你将能看到一个线程监视器,它可能提供了以下功能: 1. **实时线程视图**:列出所有活动线程并显示其状态。 2. **线程堆栈跟踪**:点击线程可以查看其当前执行的代码行和方法调用栈。 3. **线程...
4. **ThreadMonitor.cpp**:线程监视器是 ProcMon 的核心部分,它持续监控系统中的线程活动,如创建、结束、挂起和恢复。这通常涉及到Windows的线程管理和事件通知机制。 5. **NtDriverController.cpp**:NT驱动...
【进程监视器】是系统监控领域的一个重要工具,主要用于详细追踪和记录系统中各个进程的活动。这个工具能够提供深入的洞察力,帮助用户了解系统内部的运行情况,包括文件、注册表、网络以及内存等资源的访问行为。在...
2. **线程监视器**:显示当前运行的线程信息,包括线程状态(如运行、阻塞、等待等)和CPU占用情况,有助于定位线程死锁或过度竞争的问题。 3. **类加载器监视器**:监控类的加载、卸载和使用情况,有助于理解类的...
《TCP监视器增强版》是一款专门用于监测网络中TCP连接状态的强大工具,它为用户提供了一个深入洞察TCP连接细节的窗口,对于系统管理员、网络工程师以及软件开发者来说,是一款不可或缺的辅助工具。通过这款软件,...
线程同步Synchronized,监视器monitor和锁lock的关系1---马克-to-win java视频
1. **实时监控**:进程监视器可以实时显示系统中所有进程的详细信息,包括进程ID、CPU使用率、内存使用、线程、模块、网络流量等。 2. **过滤和筛选**:用户可以根据特定条件(如进程名、事件类型、路径、结果等)...
线程同步Synchronized,监视器monitor和锁lock的关系2---马克-to-win java视频
易语言创建监视器源码,创建监视器,过滤q,目录变更处理,托盘事件,sfdza,近似值,验证,监视目录,停止监视,线程_停止监视吧,线程_监视文件更变,线程_文件更变处理,UnicodeToAnsi_Ptr,API_取得Win目录,目录是否存在,启动...
文件系统监视器是一种实用工具,专门设计用于跟踪和记录文件系统的任何变化或活动。它能够帮助用户深入了解系统中发生的文件操作,例如创建、修改、删除、读取和写入等事件,这对于系统管理员、开发者以及故障排查...
Windows的进程监视器,通常被称为Process Monitor(进程监视器),是微软系统工具中的一款强大工具,主要用于实时监控系统中的各种进程活动。它提供了一个详细、深入的视图,揭示了系统内部发生的各种事件,包括文件...