确定线程是否正在睡眠
我在想如何知道线程是否正在睡眠。 我搜索了周围,我收集了一些信息,形成这些信息我写了一个方法 isSleeping():布尔,我想我可以放在一个类,以确定线程是否睡觉或不。我只想知道我可能错过了什么。注意:我没有经验0天的经验。确定线程是否正在睡眠
//isSleeping returns true if this thread is sleeping and false otherwise.
public boolean isSleeping(){
boolean state = false;
StackTraceElement[] threadsStackTrace = this.getStackTrace();
if(threadsStackTrace.length==0){
state = false;
}
if(threadsStackTrace[0].getClassName().equals("java.lang.Thread")&&
threadsStackTrace[0].getMethodName().equals("Sleep")){
state = true;
}
return state;
}
我有这个想法,我没有检查,但我认为这是可行的:
可以延长线和覆盖睡眠切换的状态。 事情是这样的:
@Override
public static void sleep(long millis, int nanos)
throws InterruptedException {
SLEEPMARKER = true;
super.sleep(millis, nanos);
SLEEPMARKER = false;
}
@Override
public static void sleep(long millis)
throws InterruptedException {
SLEEPMARKER = true;
super.sleep(millis);
SLEEPMARKER = false;
}
然后你只需要标记和一个吸气。
public static boolean SLEEPMARKER = false;
public static boolean isSleeping(){
return SLEEPMARKER;
}
更改“睡眠” - >“睡眠”。另外你不应该在this
上进行堆栈跟踪,你的方法应该接受一个Thread参数。考虑这个
Thread t = new Thread(new Runnable(){
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
Thread.sleep(100);
if(t.getStackTrace()[0].getClassName().equals("java.lang.Thread")&&
t.getStackTrace()[0].getMethodName().equals("sleep")){
System.out.println("sleeping");
}
输出
sleeping
这比我的解决方案更好。你只需要准备好非睡眠状态。它抛出ArrayIndexOutOfBoundsException – CsBalazsHungary 2013-03-13 15:44:26
当然,这只是为了证明OP的想法起作用 – 2013-03-13 15:46:35
所以这不会对你没有创建线程......包括主要工作。我不知道有足够多的东西可以轻松地改变JVM在启动时使用它,并通过它创建所有线程创建。此外,您将在中断时永久停留在睡眠状态。 – djechlin 2013-03-13 15:36:47