一个Java线程可以查看另一个线程的堆栈而不会中断它吗?

时间:2014-12-18 13:24:55

标签: java multithreading java-8

我有一个运行Callable的线程,我有另一个线程,如果它花了太长时间就会中断第一个线程,但问题是中断似乎会导致更多的问题。那么有没有办法我的第二个线程可以查看运行Callable的线程的堆栈而不会中断它,因此不会干扰它。

2 个答案:

答案 0 :(得分:4)

是的,您可以使用Thread.getAllStackTraces()检索所有可见线程的所有堆栈跟踪。这是一个Map<Thread,StackTraceElement[]>,您可以查询以获取您感兴趣的线程的堆栈跟踪。

如果你对你感兴趣的特定主题有一个引用t,那么

t.getStackTrace()

就是你所需要的一切。

请注意文档说

  

在某些情况下,某些虚拟机可能会从堆栈跟踪中省略一个或多个堆栈帧。

根据我的经验,堆栈跟踪最多限制为1024个元素。

答案 1 :(得分:0)

另外请确保您没有过于频繁地调用它。这有一个性能问题 - 首先 - 需要从所有线程收集所有堆栈信息 - 然后它在堆上分配内存,这可能导致更高的内存使用量和更多的GC开销。

并且 - 评论这些堆栈跟踪的准确性。您很可能只根据每个线程的最新安全点获取信息。有一篇很棒的文章解释了什么是安全点:http://chriskirk.blogspot.com/2013/09/what-is-java-safepoint.html