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