首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程到达末尾但未被删除

线程到达末尾但未被删除
EN

Stack Overflow用户
提问于 2009-12-15 18:59:47
回答 2查看 201关注 0票数 0

我创建了一堆线程来做一些处理:

代码语言:javascript
运行
复制
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,但我怀疑他们也会这样做。

有没有人能想到这些线程一直存在的另一个原因?

谢谢。

编辑:

我创建了这个测试来检查垃圾收集理论:

代码语言:javascript
运行
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-15 19:05:44

会不会是Thread对象本身还没有被垃圾回收,而这就是您所看到的?或者,也许Eclipse认为您可能想要查看线程(以检查其最终状态或其他什么),并将其保留在自己周围。

你有任何证据表明这是你不调试时的问题吗?

票数 2
EN

Stack Overflow用户

发布于 2010-06-08 13:26:42

我把这归因于eclipse调试器的怪异。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1906672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档