【问题标题】:Pump events from another thread than the Event Dispatching Thread in Swing从另一个线程而不是 Swing 中的事件调度线程泵送事件
【发布时间】:2012-05-16 22:40:35
【问题描述】:

在我的应用程序中,在 AWT 的事件调度线程 (EDT) 中启动的某些进程在特定情况下可能会被中断。然后它等待来自用户的输入。唉,由于进程位于 EDT,整个应用程序冻结,用户无法重新启动进程,从而造成死锁。有什么方法可以中断 EDT 并从另一个线程启动新的事件泵?然后用户将能够与 UI 交互。

我正在尝试做的事情看起来或多或少像打开一个模态对话框,除了我不想要一个对话框,因为我的组件很复杂。我宁愿在我的根窗格中显示它。所以我看了一下它是如何在 java.awt.Dialog 中完成的,并且对它有很好的理解,但是使用的最重要的类(EventDispatchThread、SequencedEvent、...)是受保护的,因此我无法访问。


谢谢大家的回答。

我会更具体。我实际上正在开发一个嵌入本土脚本语言的应用程序。我正在为这种语言开发一个调试器。每当遇到断点时,调试器(与所有调试器一样)都会停止脚本执行。可以从代码中的许多地方(包括从 EDT)触发脚本化进程,因此不能将进程从 EDT 中取出。我希望将调试器 UI 嵌入到应用程序中(准确地说是在侧窗格中)。因此,当遇到断点时,我需要中断当前线程(可能是 EDT,主要不是说),并且至少调试器的 UI 应该仍然响应。我也在 JDK 1.4 之上开发,所以没办法使用 JDK7 唉。

我目前正在做的是打开一个嵌入了调试器的 JDialog。一切正常,但正如我所说,我对这个解决方案并不完全满意,因为我真的希望我的调试器直接嵌入到我的主窗口中。

【问题讨论】:

  • 使用SwingWorker将您的进程移到EDT之外
  • ???你的答案在哪里?无论如何,你可能会找到一些破解方法来解决你的问题,但如果我是的话,我宁愿尝试一劳永逸地把事情做好,而不是使用一些非鲁棒的破解

标签: java swing event-dispatch-thread


【解决方案1】:

如果你使用JDK7,你可以使用SecondaryLoop接口。可以通过EventQueue.createSecondaryLoop方法创建这个接口的一个实例

有一个例子an informative blog post,但服务器似乎暂时离线。

我仍不能完全确定我是否理解您的问题,因此进行了小修改。

如果您想等待来自工作线程的用户输入,您可以使用SwingUtilities.invokeAndWait 方法并使用阻塞方法(例如,显示JOptionPane 来检索用户输入)。由于invokeAndWait,您的工作线程将停止,直到处理EDT 上的Runnable。如果您在 EDT 上使用阻塞方法来检索用户输入,Runnable 只有在用户提供他/她的输入时才会完成

【讨论】:

  • 当时我问这个问题时,我被 Java 4 困住了。从那以后我换了其他职位,我认为 Java 7 现在已经足够普及了。
猜你喜欢
  • 2010-10-25
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2014-01-03
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多