2

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

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


谢谢大家的答案。

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

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

4

1 回答 1

6

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

一篇内容丰富的博客文章,其中包含一个示例,但服务器目前似乎处于离线状态。

一个小的编辑,因为我仍然不完全确定我理解你的问题。

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

于 2012-05-11T16:06:21.023 回答