gpt4 book ai didi

java - 我的代码的哪一部分在事件调度队列中

转载 作者:行者123 更新时间:2023-12-03 22:52:42 25 4
gpt4 key购买 nike

在我遇到这个问题之前,我以为我了解 EDQ。我有下面显示的代码。它从 Bufferred 阅读器读取。如果收到的第一个字符是“Z”,我将执行一组代码(显示 JOptionPane),如果是 0,我将执行另一段代码(显示另一个 JOptionPane)。我试图在 EDQ 中执行此操作,因此我使用 SwingUtilities invokeAndWait。当我测试这些错误条件时,条件中的第一条语句按设计工作,但在测试 else 子句时出现 java 错误。具体来说:

线程“AWT-EventQueue-2”java.lang.Error 中的异常:无法从事件调度程序线程调用 invokeAndWait 在 java.awt.EventQueue.invokeAndWait(未知来源)

都是同一个条件的一部分。为什么一个条款是 EDQ 的一部分而另一个条款不是。

这太疯狂了。

感谢您的帮助。

埃利奥特

     while ((line = in.readLine()) != null) {
if (line.charAt(0) == 'Z') {
String theMsg;
theMsg = "No records were found.";
try {
SwingUtilities.invokeAndWait(new DoShowDialog(null, theMsg, 0));
} catch (java.lang.reflect.InvocationTargetException e1) {
e1.printStackTrace();
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
noDocs = true;
Object args[] = new Object[1];
args[0] = "1";
window.call("uploadConfig", args);
downloadAccount.setEnabled(true);
uploadAccount.setEnabled(false);
deleteAllUnselectedCodes.setEnabled(false);
queue = null;
if (poll) {
polltimer.restart();
}
} else if (line.charAt(0) == 'O') {
String theMsg;
theMsg = "Account is currently checked out
by user "+ line.substring(1)
+ ". You can view this
account but you cannot modify it. ";
try {
SwingUtilities.invokeAndWait(new DoShowDialog(null, theMsg, 0));
} catch (java.lang.reflect.InvocationTargetException e1) {
e1.printStackTrace();
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
initialckBoxState = false;
accountfoundandnotcheckedout = true;
viewMode = true;
patientpane.setEditFields(false);
otherpane.setEditFields(false);
getAccountImages(acctEntered); // bluenoble
}
.....................
more stuff
}

最佳答案

执行不会跳线程。

因此,发布的所有代码都在 EDT(事件调度线程)中运行,并且它拒绝 invokeAndWait,因为这会导致固有的死锁。 (实际上,它可以像 .NET 中的 SynchronizationContexts 一样变成立即调用,但它不是这样设计的。)

在这种特殊情况下,我怀疑代码是从 EDT 回调中调用的(并从另一个场景复制粘贴)。 “微不足道的修复”(将消除此异常)将是消除 invokeAndWait 方法,但如果此代码也在 EDT 之外调用,那将产生负面影响——这两种情况很多区别对待。花点时间确定这段代码将在何时何地运行,以及为什么。

正如其他人指出的那样,这段代码看起来很困惑:如果它关闭 EDT,则操纵 Swing 对象是不好的,如果它打开 EDT 那么就没有需要 invokeAndWait 并且阻塞是不好的。

快乐编码。

关于java - 我的代码的哪一部分在事件调度队列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7773545/

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