在我的应用程序中,在特定情况下可能会中断在AWT的事件调度线程(EDT)中启动的某些进程。然后它等待用户的输入。唉,由于进程位于EDT中,整个应用程序冻结,用户无法重新启动进程,从而造成死锁。有没有办法打断EDT并从另一个线程中启动一个新的事件泵?然后用户就可以与UI进行交互。
我想做的事情看起来或多或少像打开一个模态对话框,除了我不想要对话,因为我的组件很复杂。我宁愿在我的根窗格中显示它。所以我看看它是如何在java.awt.Dialog中完成的,并对它有很好的理解,但是使用的最重要的类(EventDispatchThread,SequencedEvent,...)受到保护,因此对我来说无法进入。
谢谢大家的回答。
我会更具体。我实际上正在开发一个嵌入了自己开发的脚本语言的应用程序。我正在为这种语言开发调试器。调试器(作为所有调试器)将在满足断点时停止脚本执行。脚本化进程可以从代码中的许多地方(包括来自EDT)触发,因此将该进程从EDT中取出不是一种选择。我希望将调试器UI嵌入到应用程序中(准确地在侧窗格中)。因此,当满足断点时,我需要中断当前线程(可能是EDT,主要不是说),并且至少调试器的UI应该仍然是响应的。另外我正在开发JDK 1.4,所以无法使用JDK7唉。
我目前正在做的是打开嵌入了调试器的JDialog。一切正常,但正如我所说,我对此解决方案并不完全满意,因为我真的希望我的调试器嵌入到我的主窗口中。
答案 0 :(得分:5)
如果您使用的是JDK7,则可以使用SecondaryLoop
界面。可以通过EventQueue.createSecondaryLoop
方法
有an informative blog post示例,但服务器目前似乎处于离线状态。
一个小编辑,因为我仍然不完全确定我理解你的问题。
如果您想等待来自工作线程的用户输入,您可以使用SwingUtilities.invokeAndWait
方法并使用阻止方法(例如,显示JOptionPane
来检索用户输入)。由于invokeAndWait
您的工作线程将被停止,直到EDT上的Runnable
被处理。如果您在EDT上使用阻止方法来检索用户输入,Runnable
只有在用户提供他/她的输入时才会完成