对于测试事项,我想在swing edt上启动一个进程,然后等待结果。
Usualy,我用invokeAndWait做到了。但也许可以使用FutureTask,并在EDT上启动此任务??
是否有可能,并且有一个(我的)想法的例子?
感谢。
答案 0 :(得分:0)
EventQueue.invokeAndWait
的行为与锁相同。内部有很多锁,这违反了通常建议的做法。因此它容易导致死锁,我建议避免它。
使用EventQueue.invokeLater
在EDT上运行任务。让该任务使用任务队列在您的线程上运行任务。 (仅限于静态,我建议在invokeLater
周围使用非静态包装器,以便您可以测试和监控)。
答案 1 :(得分:0)
你知道Swing组件操作必须在事件调度线程中完成,这很好,但简单的答案是没有,你永远不想开始长时间运行的任务或等待锁定在美国东部时间。 EDT应始终保持高度响应。另外,除此之外,由于显而易见的原因,无法从EDT调用invokeAndWait()
。
看看这篇关于Threads and Swing的旧文章 - 基本原则仍然适用。
您可以选择几种方式。您只需创建一个新的Thread
,Runnable
或FutureTask
即可在Executor
上投放,并仅在必要时调用invokeAndWait()
来更新组件(但如果您可以逃脱它,invokeLater()
更好)。您还可以使用SwingWorker
(也在文章中),它提供了在线程和EDT之间以适当的分离程度进行接口的其他有用方法。