有点不正统的情况 - 基本上我有线程A监控线程B.如果线程A检测到线程B负责的一个周期性任务(线程B不是ThreadPoolExecutor
的一部分,它是MINA的一个线程)已经过时,线程A报告错误。所以我得到了这些错误,并想知道线程B被卡住的位置。因此,线程A调用线程B getStackTrace()
并打印堆栈似乎很聪明,因此我可以看到什么愚蠢的活动B被卡住了。
在实践中,我会轻松地做到这一点,因为如果任务没有运行,则机会B的堆栈在相当长的一段时间内没有改变,因为B被阻止了。但是在理论上,有时在实践中,当线程A试图获得其堆栈跟踪时,线程B的堆栈将会发生变化。所以我想知道这是否是线程安全操作。
答案 0 :(得分:5)
查看Thread
的源代码,似乎getStackTrace()
使用private static native dumpThreads()
方法。 Thread.getAllStackTraces()使用相同的方法,根据其javadoc:
调用此方法时,线程可能正在执行。堆栈 每个线程的跟踪仅代表一个快照和每个堆栈跟踪 可以在不同的时间获得。零长度数组将是 如果虚拟机没有堆栈跟踪,则返回映射值 有关线程的信息。