Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thread.getStackTrace()是线程安全的吗?_Java_Multithreading_Thread Safety - Fatal编程技术网

Java Thread.getStackTrace()是线程安全的吗?

Java Thread.getStackTrace()是线程安全的吗?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,一种有点非正统的情况-本质上我有一个线程A监视线程B。如果线程A检测到线程B负责的一个定期任务(线程B不是ThreadPoolExecutor的一部分,它是MINA的线程之一)已过时,线程A会报告一个错误。所以我得到了这些错误,我想知道线程B被阻塞在哪里。因此,线程A调用线程BgetStackTrace()并打印堆栈似乎很明智,这样我就可以看到什么愚蠢的活动B被阻塞了 在实践中,我会稍微适应这样做,因为如果任务没有运行,很可能线程B的堆栈在相当长的一段时间内没有改变,因为B被阻塞了。但在理论上,

一种有点非正统的情况-本质上我有一个线程A监视线程B。如果线程A检测到线程B负责的一个定期任务(线程B不是
ThreadPoolExecutor
的一部分,它是MINA的线程之一)已过时,线程A会报告一个错误。所以我得到了这些错误,我想知道线程B被阻塞在哪里。因此,线程A调用线程B
getStackTrace()
并打印堆栈似乎很明智,这样我就可以看到什么愚蠢的活动B被阻塞了


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

查看
线程的源代码
似乎
getStackTrace()
使用了
私有静态本机转储线程()
方法。根据其javadoc,使用相同的方法是线程安全的:

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


为什么不直接从外部使用
jps
或VisualVM之类的工具呢?当错误发生时,需要捕捉到这一点,据我目前的经验推测,线程不会阻塞太久。