我正在使用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显示正在创建的线程,但它们永远不会关闭。 Eclipse或VisualVM都没有告诉我有关创建线程的位置或者他们正在做什么的任何信息。
如何确定线程的创建位置?如何防止他们像这样孤儿?
非常感谢!
编辑:当我暂停应用程序时,我添加了一个Eclipse的线程树的屏幕截图。
答案 0 :(得分:1)
单击Eclipse调试器中的暂停按钮,然后展开感兴趣的线程以查看它们在该时间点正在执行的操作。
或者(这不需要调试器,甚至不需要运行的进程)在JDK中使用jstack
实用程序。
当然,堆栈跟踪不会跨越线程边界 - 它们不会显示产生线程的内容。但他们可能会有所帮助。
如果他们不知道什么是产生线程,你可以在java.lang.Thread.start()
上设置一个断点。