Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程到达末端但不是';t删除_Java_Multithreading - Fatal编程技术网

Java 线程到达末端但不是';t删除

Java 线程到达末端但不是';t删除,java,multithreading,Java,Multithreading,我创建了一组线程来进行一些处理: new Thread("upd-" + id){ @Override public void run(){ try{ doSomething(); } catch (Throwable e){ LOG.error("error", e); } finally{ LOG.debug("thread

我创建了一组线程来进行一些处理:

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的调试器并查看debug窗格中列出活动线程的线程

其中许多线程如您所期望的那样完成,并从调试窗格中删除,但是有些线程似乎仍保留在活动线程列表中,即使日志显示了这些线程的“线程死亡”条目

当我尝试调试这些线程时,它们要么不暂停调试,要么显示错误对话框:“检索线程的堆栈帧时发生超时:upd-…”

doSomething()
调用中正在进行一些同步,但我相当确定这是正常的,因为正在调用“线程死亡”日志,所以我假设这些线程在该方法中没有死锁

我不做任何
Thread.join()
s,但是我确实调用了第三方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);
Thread-Thread=新线程(“!!!!!!!!!!!!!”)
{
@凌驾
公开募捐
{
System.out.println(“运行”);
ThreadUs.sleepQuiet(5000);

System.out.println(“finished”);//可能是
线程
对象本身还没有被垃圾收集,这就是您所看到的吗?或者可能Eclipse认为您可能希望看到线程(检查其最终状态或其他什么),并将其保留在自己周围


你有没有证据表明在你不调试的时候这是一个问题?

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

你能不能改变上面的代码,在finally方法中打印出每个死亡线程的id,以排除任何eclipse的怪异我已经这样做了,并添加了对Thread.getAllStackTraces()的调用-结果集不包含与我的id匹配的线程-这意味着它们在eclipse线程列表中仍然可见,但不处于活动状态。这可能意味着它们没有被正确地垃圾收集。或者可能是eclipse怪异…我不确定!当我第一次读到你的评论时,听起来有些牵强,但在“线程死亡”5秒之后我运行Thread.getAllStackTraces(),没有具有相同id的线程。因此听起来该线程好像没有被GC'd…现在,他们为什么不获得GC'd???@pstanton:垃圾收集器可能还没有运行。它不会在线程自动死亡后立即运行。但是,其他创建并在大致相同的时间完成的线程已被删除d!这些挥之不去的线程不是最近才完成的,而且似乎在那里停留了相当长的一段时间time@pstanton:您是否在其他地方保留对它们的引用?也许调试器是?我99%确定它们没有在任何地方被引用。请参阅“编辑到有关GC的问题”