EoH*_*EoH 22 java eclipse multithreading stack-trace
如何找出谁在Java中创建了一个Thread?
想象一下:您在复杂的插件环境中使用~30 个第三方 JAR.你启动它,运行大量代码,做一些计算,最后调用shutdown().
这个生命周期通常可以正常工作,除了在每次运行中一些(非守护)线程保持悬空状态.如果每次关机都是最后一次关机,那就不会有问题,在这种情况下我可以简单地运行System.exit().但是,这个循环可能会运行几次,并且每次传递都会产生更多的垃圾.
所以我该怎么做?我在Eclipse的Debug View中看到了线程.我看到他们的堆栈痕迹,但他们没有任何关于它们的起源的暗示.没有创建者的堆栈跟踪,没有可区分的类名,没有.
有谁知道如何解决这个问题?
EoH*_*EoH 14
好吧,我能够自己解决(解决)这个问题:我给了一个断点
Thread.start() 
并手动逐步完成每次调用.这样我很快发现Class.forName()初始化了很多静态代码,而这些静态代码又创建了这些神秘的线程.
虽然我能够解决我的问题,但我仍然认为更一般的任务仍然没有得到解决.
Bri*_*new 10
我虔诚地命名我的线程(使用Thread(Runnable,String),比方说),否则他们最终得到一个通用的,有点无用的名字.转储线程将突出显示正在运行的内容以及(因此)创建它们的内容.这不解决第三方线程创建,我很感激.
编辑:JavaSpecialist通讯最近(2015年2月)通过使用安全管理器解决了这个问题.有关详细信息,请参见此处
更多:使用JavaSpecialist技术的一些细节:SecurityManager API包括在线程创建者的线程上调用的"checkAccess(newThreadBeingCreated)".新线程已初始化其"名称".因此,在该方法中,您可以访问线程创建者的线程和新线程,并且可以记录/打印等.当我尝试这个时,被监视的代码开始抛出访问保护异常; 我通过在AccessController.doPriviledged(新的PrivilegedAction(){...}下调用它来修复它,其中run()方法调用被监视的代码.