【问题标题】:How can I access a synchronized buffer from a Swing Gui?如何从 Swing Gui 访问同步缓冲区?
【发布时间】: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


【解决方案1】:

查看java.util.concurrent 中的任何对象是否可以解决问题。它们提供比synchronized 更细粒度的控制。

例如,您可以使用Semaphore 执行以下操作:

在某些共享课程中

public class Shared {
  public final Semaphore mutex = new Semaphore(1);
}

在 RMI 线程中

// synchronizing with other clients...
// now we're at the critical section.  Block until we have the lock
Shared.mutex.acquireUninterruptibly();
// update state
Shared.mutex.release();
// critical section over.  Schedule an update on the GUI thread.

在 GUI 线程中

// if the critical section is free, check for updated state.  Else, just wait
if (Shared.mutex.tryAcquire())  {
   try {
     // read state and update GUI
   } finally {
     Shared.mutex.release();
   }
}

这里,GUI 线程不能保证看到每一个更新,但如果 R​​MI 线程不是不断更新状态,它应该可以工作。

【讨论】:

    【解决方案2】:

    您可以尝试多种方法。

    您可以从 RMI/读取线程触发一个事件,该事件可用于通知 UI 更改。只需确保仅在 EDT 中更新 UI。

    您可以使用 SwingWorker 在后台处理 RMI 请求,并使用 publish`process` 方法将结果同步回客户端。

    【讨论】:

      【解决方案3】:

      一种方法是使用Model–View–Controller pattern 将模型数据与视图分开,显示为hereherehere。在最后一个示例中,模型在后台线程上演进,视图使用javax.swing.Timer 定期更新。 SwingWorker,图示here,是另一种选择。

      【讨论】:

        猜你喜欢
        • 2019-03-18
        • 2021-08-17
        • 2020-02-14
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        相关资源
        最近更新 更多