gpt4 book ai didi

java - 如何在 Java 8 桌面应用程序中替换或重新启动死锁的 Swing EventDispatchThread/EventQueue

转载 作者:行者123 更新时间:2023-12-01 06:23:40 25 4
gpt4 key购买 nike

不久前,我们向应用程序添加了一些代码来检测并尝试从 Swing EDT 死锁中恢复,因此用户至少可以保存他们的文件(最好不要出现死锁,但是......) 。在 Java 1.6 中,这很容易。检测 EDT 已被阻塞足够长的时间,然后从后台线程调用此函数:

EventQueue newQ = new EventQueue();
Toolkit.getDefaultToolkit().getSystemEventQueue().push(newQ);

新的 UI 事件将在新的 EventQueue/EDT 上处理,用户可以保存他们的工作。

在 Java 8 中,这不起作用,因为 EventQueue.push 的实现已更改为将(阻塞的)EventDispatchThread 从旧队列复制到新队列。

最佳答案

当然,我总是可以做一些邪恶的事情:

private static void hackAroundJava8Protections(EventQueue newQ) {
try {
Field field = newQ.getClass().getDeclaredField("dispatchThread");
field.setAccessible(true);
field.set(newQ, null);
Method method = newQ.getClass().getDeclaredMethod("initDispatchThread");
method.setAccessible(true);
method.invoke(newQ);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}

这将启动一个新的 EventDispatchThread,允许使用应用程序 UI。我能够像用户一样保存数据。我不确定可能会有什么缺点。也许有一种不那么可怕的方法可以重新启动被阻止的 EDT?

关于java - 如何在 Java 8 桌面应用程序中替换或重新启动死锁的 Swing EventDispatchThread/EventQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28490026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com