3

有点不正统的情况 - 基本上我有线程 A 监视线程 B。如果线程 A 检测到线程 B 负责的周期性任务之一(线程 B 不是 a 的一部分ThreadPoolExecutor,它是 MINA 的线程之一)已经过时,线程 A报告一个错误。所以我收到了这些错误,想知道线程 B 卡在哪里。所以线程 A 调用线程 BgetStackTrace()并打印堆栈似乎很聪明,这样我就可以看到 B 卡在什么愚蠢的活动上。

在实践中,我会稍微适应一下,因为如果任务没有运行,线程 B 的堆栈很可能因为 B 被阻塞而在相当长的一段时间内没有改变。但在理论上,有时在实践中,当线程 A 尝试获取其堆栈跟踪时,线程 B 的堆栈会发生变化。所以我想知道这是否是线程安全操作。

4

1 回答 1

5

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

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

于 2012-11-21T16:53:56.187 回答