gpt4 book ai didi

java - SwingUtilities.invokeAndWait 不等待?

转载 作者:行者123 更新时间:2023-12-03 06:15:38 25 4
gpt4 key购买 nike

以下代码运行良好

abstract class FunctionRunnable<V> implements Runnable {
protected abstract V calculate();
private V result;
private Throwable thr;

public synchronized final void run() {
try {
result = calculate();
}
catch (Throwable thr) {
this.thr = thr;
}
}

public synchronized final V getResult() {
if (thr != null) {
throw new RuntimeException(thr);
}
return result;
}
}

...
final FunctionRunnable<Boolean> runnable = new FunctionRunnable<Boolean>() {
public Boolean calculate() {
return doCalculation();
}

private boolean doCalculation() {
...
}
});
SwingUtilities.invokeAndWait(runnable);
final Boolean resultObj = runnable.getResult();
final boolean result = resultObj.booleanValue();

直到 Apple 发布 1.6.0_31 之前,我们的应用程序的用户有时会在最后一行收到 NPE。

您是否在代码中发现了错误,或者其他人是否在这个特定的 Java 更新中发现了类似的问题?

最佳答案

如果您查看 EventQueue.invokeAndWait 的实现,您会发现它无法正确处理虚假唤醒。它调用lock.wait(),然后不检查可运行对象是否实际上已完成执行 - 这意味着invokeAndWait可以在可运行对象完成执行之前返回!

出于某种原因,在 macOS 的更新 31 中,虚假唤醒开始以合理的频率发生,暴露了 EventQueue 中这个长期存在的错误。我不确定发生了什么变化,在任何其他版本的 Java 中都没有发生这种情况。

我们通过实现自己的 invokeAndWait 方法来修复此问题,并使用简单的 boolean 检查来检查可运行的完成情况。

关于java - SwingUtilities.invokeAndWait 不等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10752672/

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