【问题标题】:Event Dispatching Thread execution事件调度线程执行
【发布时间】:2023-03-25 23:26:01
【问题描述】:
使用 Java Swing,是否可以暂停当前线程 Runnable 并为事件调度线程腾出空间来更新 gui?
我知道多线程 (SwingWorker class) 是可能的,但我想知道对于单线程程序是否有更简单的方法来实现这一点(又名:我所有的代码都在 gui 的 Run() 中)。
例如Matlab有很方便的drawnow;方法
如果不是:如何将更新任务拆分到第二个线程而无需重写任何内容?这会是来自this link 的从正在运行的线程更新 gui 吗?
【问题讨论】:
标签:
java
swing
user-interface
event-dispatch-thread
【解决方案1】:
简短的回答是否定的。如果您暂停当前线程(根据您的说法是 EDT),那么您暂停 EDT...
您可以使用repaint 之类的方法请求更新 UI,但这也假设您没有通过循环和暂停等方式阻塞 EDT,因为 EDT 需要时间来处理这些请求。
不,我不会遵循链接的建议,因为它通过更新 EDT 之外的组件违反了 Swing 的单线程
根据您的需要,您可能需要使用javax.swing.Timer 或SwingWorker。是的,您可以使用Thread,您将负责确保 UI 的所有更新都同步回 EDT,其他两个建议为此提供机制。
查看Concurrency in Swing了解更多详情