我们正在遇到一个错误,我们无法追踪哪些东西冻结了我们的摇摆线程(现在已经差不多2个星期而且没有真正的结果) - 我们是经验丰富的Swing程序员,但我们有一个庞大的程序,并相信它在一些遗留代码
我想知道,除了编辑JDK中的实际EventQueue
类之外还有什么方法可以让我们查看当前在事件调度线程上运行的所有代码 - 可能是某种类型的工具将允许我们在进入或离开事件派遣线程时查看事物?
答案 0 :(得分:5)
一种有趣的方法是扩展EventQueue
和push()
,如图here所示。
答案 1 :(得分:4)
记录通过事件调度线程的所有内容似乎是一种诊断冻结的麻烦方法。是不是更容易等到问题发生,然后问事件调度线程它正在做什么现在?执行此操作的一种方法是enable JMX monitoring,使用JMX客户端连接到正在运行的进程,例如VisualVM(随JDK一起提供),等待问题发生,然后{{3} }。
如果您仍希望记录Event Dispatch Thread正在执行的所有操作,您可以通过以下方式执行此操作:
在EventQueue.dispatchEvent
上创建断点,右键单击它,选择“属性”,选中“条件”,然后输入以下“条件”:
System.out.println(arg0);
return false;
答案 2 :(得分:2)
尝试BTrace来检测EventQueue并在每次添加内容时捕获堆栈跟踪可能是个好主意。我认为最新的VisualVM具有插件,允许您使用BTrace脚本检测正在运行的JVM。
答案 3 :(得分:0)
如果您使用的是Oracle JRE,则已经包含TracedEventQueue。您可以按照之前的说明安装它:
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new TracedEventQueue());
注意,这将输出批次的输出...