检测谁创建的线程(W的日食)(Detect Who Created a Thread (w. Ecl

2019-09-22 03:39发布

我怎样才能找出谁在Java中创建线程?

想象一下以下内容:您在复杂的插件的环境下使用约30个第三方 JAR文件。 你启动它,运行大量的代码,做了一些计算,最后调用shutdown()。

这种生命周期通常工作得很好,但在每一个运行一些(非邪)线程保持晃来晃去。 这将是没有问题的,如果每次关机是最后关机,我可以简单地在这种情况下运行System.exit()的。 然而,这个周期可能运行多次,它产生更多的垃圾每通。

所以我该怎么做? 我看到在Eclipse的Debug视图的线程。 我看到自己的堆栈跟踪,但不包含有关其来源的任何暗示。 无创作者的堆栈跟踪,没有任何区别的类名,什么都没有。

有没有人有一个想法如何解决这个问题?

Answer 1:

好吧,我是能够解决(在某种程度上)对我自己的问题:我把断点到

Thread.start() 

并通过每次调用手动台阶。 这样,我很快发现了的Class.forName()初始化大量的静态代码作为回报创造了这些神秘的线程。

虽然我能够解决我的问题,我仍然认为更一般的任务仍然没有得到解决。



Answer 2:

我虔诚的名字我的线程(使用线程(Runnable接口,串) ,说的),否则,他们结束了一个通用的,有些没用的名字。 转储线程将突出什么样的运行和(因此)什么是创造了他们。 这并没有解决第三方线程的创建,我很欣赏。

编辑:JavaSpecialist通讯通过使用安全经理最近解决了这个问题(2015年2月)。 请参见此处了解更多详情

以上:安全管理器API包括“的checkAccess(newThreadBeingCreated)”被称为线程创建者的线程上:一种使用JavaSpecialist技术夫妇的细节。 新的线程已经初始化它的“名字”。 因此,在这种方法中,你都可以访问两个线程创建者的线程,而新的,并且可以登录/打印等。当我尝试这样被监视的代码开始呕吐访问保护异常; 我固定,通过下AccessController.doPriviledged(新的PrivilegedAction(){...},其中run()方法调用的代码调用它受到监视。



Answer 3:

当调试运行Eclipse应用程序,您可以通过点击org.eclipse.equinox.launcher.Main场在调试视图停止所有线程。

然后从那里,每个线程可以看到堆栈跟踪,并上升到thred run方法。

有时,这可以帮助有时不是。

正如布赖恩说,它一个很好的做法来命名线程,因为它可以轻松地识别“谁创造了他们”唯一的办法



Answer 4:

不幸的是事实并非如此。 在Eclipse中我看到所有的阻塞线程,但它们的堆栈跟踪仅反映了其内部状态和(显然)没有透露他们创造的位置信息。 还从查找对象内部(使用变量视图)我无法引起任何进一步提示。



文章来源: Detect Who Created a Thread (w. Eclipse)