如何在Java中诊断孤立线程的来源?

时间:2013-11-26 22:21:33

标签: java eclipse multithreading debugging xuggler

我正在使用Java和Xuggler库编写一段视频分析软件。我的代码都是单线程的,但其中一些是从Xuggler线程中调用的。

我必须处理一个充满视频文件的目录,所以我遍历文件并为每一个我启动一个IMediaReader实例然后处理帧。当我完成后,我分离听众并关闭阅读器。像这样:

public void ProcessFrames(VideoFile file, MediaProcessor processor, int ImageType) 
{
    IMediaReader mediaReader = ToolFactory.makeReader(file.location);
    mediaReader.setBufferedImageTypeToGenerate(ImageType);  

    mediaReader.addListener(processor);
    mediaReader.open();
    IError videoDecodeError = null;
    while (videoDecodeError == null && 
           processor.isListenerFinishedWithStream() == false)
    {
        try {
            videoDecodeError = mediaReader.readPacket();
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }       

    System.out.println("Closing media reader.");
    mediaReader.close();
    mediaReader.removeListener(processor);
}

我注意到每次创建一个新的IMediaReader时,它似乎都会打开一个线程并且只是闲逛。问题是我似乎无法找到有关孤立线程的任何信息。在Eclipse中,它们显示为“ Thread [Thread-2](Running)”。

我找不到任何关于线程卡住位置的信息,或者是什么线程产生的信息。我附上了VisualVM,看看它是否会告诉我发生了什么。该图表非常有用,但它没有回答我的问题:

VisualVM showing thread leak

VisualVM显示正在创建的线程,但它们永远不会关闭。 Eclipse或VisualVM都没有告诉我有关创建线程的位置或者他们正在做什么的任何信息。

如何确定线程的创建位置?如何防止他们像这样孤儿?

非常感谢!

编辑:当我暂停应用程序时,我添加了一个Eclipse的线程树的屏幕截图。

Eclipse threads window

1 个答案:

答案 0 :(得分:1)

单击Eclipse调试器中的暂停按钮,然后展开感兴趣的线程以查看它们在该时间点正在执行的操作。

或者(这不需要调试器,甚至不需要运行的进程)在JDK中使用jstack实用程序。

当然,堆栈跟踪不会跨越线程边界 - 它们不会显示产生线程的内容。但他们可能会有所帮助。

如果他们不知道什么是产生线程,你可以在java.lang.Thread.start()上设置一个断点。