对于测试的东西,我想在swing swing edt上启动一个进程,并等待结果。如何等待EDT的结果?
Usualy,我用invokeAndWait来做。但也许有可能使用FutureTask,并在EDT上启动此任务?
是否有可能,并且你有(我的)想法的例子吗?
谢谢。
对于测试的东西,我想在swing swing edt上启动一个进程,并等待结果。如何等待EDT的结果?
Usualy,我用invokeAndWait来做。但也许有可能使用FutureTask,并在EDT上启动此任务?
是否有可能,并且你有(我的)想法的例子吗?
谢谢。
EventQueue.invokeAndWait
的行为与锁相同。内部可怕的锁,这是反对通常的建议,以保持短暂。因此它容易造成死锁,我建议避免它。
使用EventQueue.invokeLater
在EDT上运行任务。该任务使用任务队列在您的线程上运行任务。 (只能避免静态,我建议在invokeLater
附近使用非静态包装,以便测试和监控)。
很好,您知道Swing组件操作必须在事件派发线程中完成,但简单的答案是no,您永远不想在EDT中启动长时间运行的任务或等待锁定。美国东部时间应始终保持高度敏感。此外,由于显而易见的原因,不能从EDT调用invokeAndWait()
。
看看这篇关于Threads and Swing的旧文章 - 基本原理仍然适用。
您有几种选择可供您选择。您只需创建一个新的Thread
,Runnable
或FutureTask
即可在Executor
上运行,并且只有在需要更新组件时才会调用invokeAndWait()
(但如果您可以避开它,invokeLater()
更好)。您也可以使用SwingWorker
(也在文章中),它提供了其他有用的方法,可以在线程和EDT之间以适当的分离度进行连接。
感谢您的帮助。但我不想在edt内部等待,我想在美国东部时间之外等待。例如:我启动一个invokeLater来显示一个JFrame,另一个在这个框架中显示一个按钮等;我想在所有悬而未决的edt结束时进行测试。这怎么可能 ? – Istao 2011-03-25 13:04:04