2011-01-22 69 views
0

对于测试的东西,我想在swing swing edt上启动一个进程,并等待结果。如何等待EDT的结果?

Usualy,我用invokeAndWait来做。但也许有可能使用FutureTask,并在EDT上启动此任务?

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

谢谢。

回答

0

EventQueue.invokeAndWait的行为与锁相同。内部可怕的锁,这是反对通常的建议,以保持短暂。因此它容易造成死锁,我建议避免它。

使用EventQueue.invokeLater在EDT上运行任务。该任务使用任务队列在您的线程上运行任务。 (只能避免静态,我建议在invokeLater附近使用非静态包装,以便测试和监控)。

0

很好,您知道Swing组件操作必须在事件派发线程中完成,但简单的答案是no,您永远不想在EDT中启动长时间运行的任务或等待锁定。美国东部时间应始终保持高度敏感。此外,由于显而易见的原因,不能从EDT调用invokeAndWait()

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

您有几种选择可供您选择。您只需创建一个新的ThreadRunnableFutureTask即可在Executor上运行,并且只有在需要更新组件时才会调用invokeAndWait()(但如果您可以避开它,invokeLater()更好)。您也可以使用SwingWorker(也在文章中),它提供了其他有用的方法,可以在线程和EDT之间以适当的分离度进行连接。

+0

感谢您的帮助。但我不想在edt内部等待,我想在美国东部时间之外等待。例如:我启动一个invokeLater来显示一个JFrame,另一个在这个框架中显示一个按钮等;我想在所有悬而未决的edt结束时进行测试。这怎么可能 ? – Istao 2011-03-25 13:04:04