2012-11-21 202 views
3

有点非正统的情况 - 本质上我有线程监视线程B.如果线程A检测到线程B负责的一个周期性任务(线程B不是ThreadPoolExecutor的一部分,它是MINA的线程之一)已经过时,线程A会报告一个错误。所以我得到这些错误,并想知道线程B堵塞的位置。所以线程A调用线程B getStackTrace()并打印堆栈看起来很聪明,这样我就可以看到什么愚蠢的活动B被阻塞了。是Thread.getStackTrace()线程安全吗?

在实践中,我会很轻松地做到这一点,因为如果任务没有运行,线程B的堆栈在一段时间内没有改变,因为B被阻塞。但是在理论上,有时在线程A尝试获取堆栈跟踪时,线程B的堆栈将会发生变化。所以我想知道这是否是一个线程安全操作。

+0

为什么不从外部或像VisualVM这样的工具使用'jps'? –

+1

当错误发生时需要抓住这一点,据推测(并且以我迄今为止的经验),线程不会长时间停滞。 – djechlin

回答

5

看看Thread的源代码,看来getStackTrace()使用private static native dumpThreads()方法。 Thread.getAllStackTraces()使用相同的方法,根据它的javadoc是线程安全的:

调用此方法时线程可能正在执行。每个线程的堆栈跟踪仅表示一个快照,并且可以在不同的时间获得每个堆栈跟踪 。如果虚拟机没有堆栈跟踪 有关线程的信息,则返回映射值中的零长度数组将为 。