java - SWT/Swing -> 线程 hell

标签 java multithreading swing swt

我有一个 SWT 应用程序。我对 SWT 感到很沮丧,因为它没有让我轻松地做我想做的事情。所以我用了Swing。 Swing 让我的生活变得轻松。耶。只是现在,两个人必须谈谈。问题是,它们在不同的线程上运行,每当我尝试从 Swing 运行 SWT GUI 方法时,我都会得到:

Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access

哦,快乐。那么,我该如何解决这个问题呢?如果这是 Objective-C,我可以使用:

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait

但事实并非如此,所以我不能。有没有办法在线程B上运行方法A?该线程何时存在?

最佳答案

我没有太多使用 SWT,但似乎 SWT 将严格禁止在非 UI 线程中访问 SWT 对象。您可以将与 SWT 上的对象对话的请求排队。

This链接更好地解释了这一点

该示例建议您使用syncExec

display.syncExec(
  new Runnable() {
    public void run(){
      label.setText(text);
    }
  });

我可以假设这会将 Runnable 在主 SWT UI 线程上排队,因此访问是合法的。

注意:我再次阅读了该链接,syncExec 最终会卡住您的 Swing EDT。如果调用syncExec,它将把Runnable 扔到SWT 队列上并等待它完成。您可以查看 asyncEvent 将可运行对象放入队列中并继续工作。

关于java - SWT/Swing -> 线程 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857531/

相关文章:

java - 不使用 Spring 发送 HTML 模板电子邮件

java - 将 Clob 转换为字符串

java - 关键事件不起作用

java - 如何在 Java 应用程序中使用最小库来检测音频源的节拍?

c - 非线程应用程序的线程共享库

c++ - 32 位 int 类型的 Win API 互锁操作

linux - SO_REUSEPORT 套接字服务器

java - 从Java中的另一个类访问图形渲染方法

java - KeyListener 仅在单击 Canvas 后才激活

java - 我的两个类如何共享相同的 JFrame 或 Frame?