我创建了一堆线程来做一些处理:
new Thread("upd-" + id){
@Override
public void run(){
try{
doSomething();
}
catch (Throwable e){
LOG.error("error", e);
}
finally{
LOG.debug("thread death");
}
}
}.start();我知道我应该使用threadPool,但在更改它之前,我需要了解以下问题:
我正在使用eclipse的调试器,并在调试窗格中查看线程,其中列出了活动线程。
其中许多线程如您所期望的那样完成,并从调试窗格中删除,但是有些线程似乎留在活动线程列表中,即使日志中显示了这些线程的“线程死亡”条目。
当我尝试调试这些线程时,它们要么不会暂停调试,要么会显示一个错误对话框:"A timeout occurred retrieving frames thread: upd-...“。
在doSomething()调用中有一些同步正在进行,但我相当确定这是可以的,而且由于正在调用“线程死亡”日志,我假设这些线程在该方法中没有死锁。
我不做任何Thread.join(),但是我会调用第三方API,但我怀疑他们也会这样做。
有没有人能想到这些线程一直存在的另一个原因?
谢谢。
编辑:
我创建了这个测试来检查垃圾收集理论:
Thread thread = new Thread("!!!!!!!!!!!!!!!!")
{
@Override
public void run()
{
System.out.println("running");
ThreadUs.sleepQuiet(5000);
System.out.println("finished"); // <-- thread removed from list here
}
};
thread.start();
ThreadUs.sleepQuiet(10000);
System.out.println(thread.isAlive()); // <-- thread already removed from list but hasn't been GC'd
ThreadUs.sleepQuiet(10000);这证明它与垃圾收集无关,因为一旦eclipse完成,它就会从线程列表中删除线程,而不是等待对象被取消引用/GC。
发布于 2009-12-15 19:05:44
会不会是Thread对象本身还没有被垃圾回收,而这就是您所看到的?或者,也许Eclipse认为您可能想要查看线程(以检查其最终状态或其他什么),并将其保留在自己周围。
你有任何证据表明这是你不调试时的问题吗?
发布于 2010-06-08 13:26:42
我把这归因于eclipse调试器的怪异。
https://stackoverflow.com/questions/1906672
复制相似问题