如何等待EDT的结果?

时间:2011-01-22 13:41:43

标签: java swing

对于测试事项,我想在swing edt上启动一个进程,然后等待结果。

Usualy,我用invokeAndWait做到了。但也许可以使用FutureTask,并在EDT上启动此任务??

是否有可能,并且有一个(我的)想法的例子?

感谢。

2 个答案:

答案 0 :(得分:0)

EventQueue.invokeAndWait的行为与锁相同。内部有很多锁,这违反了通常建议的做法。因此它容易导致死锁,我建议避免它。

使用EventQueue.invokeLater在EDT上运行任务。让该任务使用任务队列在您的线程上运行任务。 (仅限于静态,我建议在invokeLater周围使用非静态包装器,以便您可以测试和监控)。

答案 1 :(得分:0)

你知道Swing组件操作必须在事件调度线程中完成,这很好,但简单的答案是没有,你永远不想开始长时间运行的任务或等待锁定在美国东部时间。 EDT应始终保持高度响应。另外,除此之外,由于显而易见的原因,无法从EDT调用invokeAndWait()

看看这篇关于Threads and Swing的旧文章 - 基本原则仍然适用。

您可以选择几种方式。您只需创建一个新的ThreadRunnableFutureTask即可在Executor上投放,并仅在必要时调用invokeAndWait()来更新组件(但如果您可以逃脱它,invokeLater()更好)。您还可以使用SwingWorker(也在文章中),它提供了在线程和EDT之间以适当的分离程度进行接口的其他有用方法。