gpt4 book ai didi

java - 在 Mac 上运行 SWT 应用程序抛出非法线程访问

转载 作者:行者123 更新时间:2023-11-30 10:51:46 26 4
gpt4 key购买 nike

我使用 SWT 编写了一个跨平台应用程序。在 Mac 上,它抛出一个 SWTExceptionIllegal thread access

many answers which say to use -XstartOnFirstThread

但是,使用起来确实很不方便。不得不说这令人沮丧

To run the application, simply double click the program, unless you use Mac. If you use Mac, please open up Terminal, and run the following commands. If they do not work please refer to these instructions on how to configure your PATH and JAVA_HOME

有没有什么方法可以在不使用 -XstartOnFirstThread 的情况下在 Java 中解决这个问题?

最佳答案

实际上有一种方法可以在主线程上以编程方式运行 SWT 的 readAndDispatch,而无需使用命令行选项。它一般不常被提及,在谈论 SWT 时甚至更少被提及。我刚刚发现这件事,它救了我一命。

com.apple.concurrent.Dispatch 仅存在于 Mac 上并且可以生成一个 Executor 允许将任务提交到主线程。使用它可以创建一个跨平台的 SWT 应用程序,它总是在双击时打开。

当然,因为Windows/Linux上不存在该类,所以不能简单的直接调用需要的方法。如果这样做,您的应用程序将在 Windows/Linux 上因 ClassNotFoundException 而失败。相反,仅当当前操作系统为 Mac 时,您才需要使用一些反射在主线程上运行 readAndDispatch

您需要检查操作系统是否为 Mac。为此,您可以使用以下代码。

if (System.getProperty("os.name").toLowerCase().contains("mac"))

之后,您可以使用反射来调用必要的方法。

Executor executor;
try {
Class<?> dispatchClass = Class.forName("com.apple.concurrent.Dispatch");
Object dispatchInstance = dispatchClass.getMethod("getInstance").invoke(null);
executor = (Executor) dispatchClass.getMethod("getNonBlockingMainQueueExecutor").invoke(dispatchInstance);
} catch (Throwable throwable) {
throw new RuntimeException("Could not reflectively access Dispatch", throwable);
}

终于可以在executor中执行你的runnable了,喜极而泣,因为你的应用又跨平台了。

关于java - 在 Mac 上运行 SWT 应用程序抛出非法线程访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34594946/

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