大家都知道线程是不可靠的,我想了一些办法去监视线程当前的运行状态,能得到比如该线程到了那个类的那个方法了,到了哪一行了,在细粒度的控制上还是有一定作用的。
之前去实现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
大家来讨论把,还有没有更好的办法,或者思路上有没有问题,有没有想错的地方。
分享到:
相关推荐
这是一个C#学习与参考代码,希望对正在学习C#的朋友有所帮助!
编写进程/线程监视器
摘要:C#源码,系统相关,多线程,监视器 一个适合初学者参考学习的C#多线程监视器程序,创建3个线程,模拟多线程运行,并绑定TestRun方法,定义线程的绑定方法,在同步对象上获取排他锁,模拟做一些耗时的工作。
线程监视器 线程监视器桌面 Java 应用程序
监控器线程监视器,用于从CMTS获取电缆调制解调器和上行通道,并同步到数据库。
用PsSetCreateProcessNotifyRoutine,PsSetCreateThreadNotifyRoutine来进行进程线程监控我想大家已经都非常熟练了.sinister在编写进程/线程监视器>>一文中已经实现得很好了.前一段时间看到网上有人在研究监视远线程...
本文讨论了将异步过程调用用于内核/用户模式通信的方法。
线程同步Synchronized,监视器monitor和锁lock的关系1---马克-to-win java视频
线程同步Synchronized,监视器monitor和锁lock的关系2---马克-to-win java视频
易语言创建监视器源码,创建监视器,过滤q,目录变更处理,托盘事件,sfdza,近似值,验证,监视目录,停止监视,线程_停止监视吧,线程_监视文件更变,线程_文件更变处理,UnicodeToAnsi_Ptr,API_取得Win目录,目录是否存在,启动...
Process Monitor (进程/线程 、文件 、注册表监视器)
线程同步Synchronized,监视器monitor和锁lock的关系2---马克-to-win java视频
一个目录监视器源码,监视目录文件下的文件是否删除,修改,增加. 能够时时监控硬盘文件的变化,其中包括删除,修改,增加,同时自己写了一个监控引擎,能够有效的监控硬盘文件变化,非常有创意。 采用多线程技术,...
它提供关于发现的线程转储的统计信息,提供关于锁定监视器和等待线程的信息。它可以在线程之间进行区分,以寻找相似之处,并具有“长运行线程”检测。如果记录了类的直方图,它还提供了线程转储中的堆对象的概述。
2. 监视器(Monitor)和互斥锁(lock) 3. 读写锁(ReadWriteLock) 4. 系统内核对象 1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent)2) 线程池 除了以上的这些对象之外实现线程...
系统监视器可以查看 SQL Server 对象和性能计数器以及其它对象的行为,这些对象包括处理器、内存、高速缓存、线程和进程。每个对象都有一个相关的的计数器集,用于测量设备使用情况、队列长度、延时情况,另外还有...
安全监视器(SM)是以 M 模式运行的可信软件,是 Keystone 系统中的可信计算基础(TCB)。SM 是 Keystone 中最重要的软件,因为它提供了大部分安全保障。SM提供以下功能: 1.使用RISC-V PMP的内存隔离 2.远程证明...
Fortinet线程监视器 用Django和Python开发一个程序,该程序读取“威胁”元文件并使用ajax将它们呈现在表中。 表中的每个记录应包括图元文件的所有字段。 每行还应根据记录的威胁级别(等级)进行颜色编码。 该表还应...
包括java的Thread类,同步块(synchronized),可重入锁,Object方法以及对象监视器等内容。