如何让多个Jframe使用Java中相同线程的数据?

时间:2017-01-14 01:06:58

标签: java multithreading swing thread-safety swingworker

我有一个必须输出加权比例数据的程序。它使用一个线程连续读取来自rs232源的数据,并且必须以图形方式输出数据。用户可以打开和关闭任意数量的Jframe,并且所有Jframe都必须显示从JTextArea中的rs232读取的相同数据。我怎么处理这个? 非常感谢你提前。

2 个答案:

答案 0 :(得分:1)

您可以通过多种方式解决此问题

  

用户可以打开和关闭任意数量的Jframe,并且所有Jframe都必须显示从rs232读取的相同数据

如果您只对实时结果或历史结果感兴趣,这就提出了一个问题。为了论证,我只关注实时结果。

基本上你需要从一个负责实际从端口读取数据的类开始。这个课只应该做两件事:

  1. 阅读数据
  2. 在读取新数据时生成事件
  3. 为什么呢?因为您可以稍后添加您想要实现的任何其他功能(例如将数据写入数据库或缓存结果),只需监视生成的事件即可。

    接下来,您需要定义一个interface来描述观察者为了能够接收事件而实施的合同

    public interface ScaleDataSourceListener {
        public void scaleDataUpdated(ScaleDataSourceEvent evt);
    }
    

    您还可以添加连接事件(连接/断开连接)或其他可能很重要的事件,但我保持简单。

    ScaleDataSourceEvent将是一个简单的interface,它描述了事件的数据

    public interface ScaleDataSourceEvent {
        public ScaleDataSource getSource();
        public double data();
    }
    
    例如

    (我喜欢接口,它们描述了预期的合同,定义了责任并限制了其他人在收到实现接口的对象实例时可以做的事情,但那就是我)

    然后,您的数据源将允许观察者注册自己以通知其生成的事件......

    public interface ScaleDataSource ... {
        //...
        public void addDataSourceListener(ScaleDataSourceListener listener);
        public void removeDataSourceListener(ScaleDataSourceListener listener);
    }
    

    (我假设数据源可以执行其他操作,但是我已经将此留给您填写,再次,我更喜欢可能的接口,而不是您的设计限制;))

    因此,当从端口读取数据时,它将生成一个新事件并通知所有已注册的侦听器。

    现在,Swing不是线程安全的,这意味着,你不应该从事件调度线程以外的任何线程更新UI。

    在您的情况下,最简单的解决方案可能是简单地使用SwingUtilities.invokeLater从数据源线程上下文移动到EDT。

    基本上,这是一个简单的Observer Pattern

    您还需要考虑很多其他因素。即,框架是否在与数据源相同的过程中打开,或者数据源是否在其自身的单独过程中运行。这使得该过程变得复杂,因为您需要某种IPC系统,可能使用套接字,但最重要的设计是相同的。

    如果数据源更快地读取数据然后您可以生成事件,会发生什么?您可能需要某种队列,其中数据源只是将数据转储到队列中,并且您有某种调度程序(在另一个线程上)读取它并调度事件。

    阻塞队列的数量实现提供了一定程度的线程安全性,请查看并发API以获取更多详细信息。

    ......作为一些想法;)

答案 1 :(得分:-1)

首先,创建一个扩展JFrame的框架类,并创建一个从rs232接收数据的方法。然后,此类的每个对象都可以使用该方法获取数据。 你可以通过创建一个类的对象来创建一个框架。