Thread.getStackTrace()线程安全吗?

时间:2012-11-21 16:47:10

标签: java multithreading thread-safety

有点不正统的情况 - 基本上我有线程A监控线程B.如果线程A检测到线程B负责的一个周期性任务(线程B不是ThreadPoolExecutor的一部分,它是MINA的一个线程)已经过时,线程A报告错误。所以我得到了这些错误,并想知道线程B被卡住的位置。因此,线程A调用线程B getStackTrace()并打印堆栈似乎很聪明,因此我可以看到什么愚蠢的活动B被卡住了。

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

1 个答案:

答案 0 :(得分:5)

查看Thread的源代码,似乎getStackTrace()使用private static native dumpThreads()方法。 Thread.getAllStackTraces()使用相同的方法,根据其javadoc:

是线程安全的
  

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