【发布时间】:2022-01-17 18:31:02
【问题描述】:
使用此代码运行我的 Java 应用程序:
if (Desktop.isDesktopSupported())
{
Desktop d = Desktop.getDesktop();
try
{
d.browse(new URI("someurl")); // someurl is just an example, I am opening real url
}
catch (IOException | URISyntaxException e)
{
logger.warn(ExceptionUtils.getStackTrace(e));
}
}
导致应用程序在 Manjaro Linux KDE 上无响应(可能是死锁)。虽然它在 Windows 上没有问题,但我不想在我的应用程序中检查操作系统并只允许它用于 Windows。我还没有尝试过其他平台。
我用什么:
- 采用 JDK 11
- Manjaro 内核 5.10.83-1-MANJARO 64bit
- KDE 等离子 5.23.4
- Qt 5.15.2
详细死锁位置:
Desktop类:
public void browse(URI uri) throws IOException {
checkAWTPermission();
checkExec();
checkActionSupport(Action.BROWSE);
Objects.requireNonNull(uri);
peer.browse(uri); // <- goes here
}
死锁发生在在方法gnome_url_show(...) 上实现DesktopPeer 接口(peer)的XDesktopPeer 类中:
private void launch(URI uri) throws IOException {
byte[] uriByteArray = ( uri.toString() + '\0' ).getBytes();
boolean result = false;
XToolkit.awtLock();
try {
if (!nativeLibraryLoaded) {
throw new IOException("Failed to load native libraries.");
}
result = gnome_url_show(uriByteArray); // <- deadlock / app not responding here
} finally {
XToolkit.awtUnlock();
}
if (!result) {
throw new IOException("Failed to show URI:" + uri);
}
}
那么...Linux 平台上是否仅支持 Gnome 桌面的 Desktop#browse?
我猜这个,因为那个方法名。
如果是,我可以检查我的代码是否存在死锁,以便在我的应用程序中防止这种情况发生吗?而不是检查操作系统和发行版?
【问题讨论】:
标签: java awt deadlock gnome manjaro