【发布时间】:2012-08-21 13:30:20
【问题描述】:
我必须编写一个使用 RMI 的 GUI 应用程序来保持跨多个客户端的一致状态。
因为 RMI 调用会阻塞,所以我将它们放在与 GUI 线程不同的线程中。 要将信息推送到 GUI 线程和从 GUI 线程推送信息,我的第一个想法是使用同步缓冲区。
但如果我在 Buffer 上调用同步方法,GUI 将冻结。如果我不使用 synchronized 关键字,缓冲区将不是线程安全的。
来自 Java 文档:
在同一个对象上两次调用同步方法是不可能交错的。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。
是否有其他替代方案可以使缓冲区线程安全且不会冻结 GUI。
【问题讨论】:
-
如果您从工作线程调用缓冲区上的方法,我认为它不应该冻结 GUI。除非我错过了什么。请解释你为什么不这么认为。
-
@HovercraftFullOfEels 我认为他指的是 UI 必须在某个阶段尝试从缓冲区中读取。听起来像是
SwingWorker的工作 -
@Mad:但这正是我的观点。如果他使用 SwingWorker 或任何后台工作线程,这将如何占用 Swing 事件线程、EDT?
-
@HovercraftFullOfEels 我不认为他在设计中走得那么远;)
标签: java multithreading swing user-interface synchronization