Java:观察者或同步+;在串行端口传入数据时通知()

Java:观察者或同步+;在串行端口传入数据时通知(),java,serial-port,rxtx,Java,Serial Port,Rxtx,我有一个串行端口,有数据输入。我用一个串口事件监听器实现了与RXTX库的串口连接。因此,只要串行端口中有可用的传入数据,同步函数serialEvent(SerialPortEvent-oEvent)就会运行。基本上,随着数据的不断输入,程序将处于无限循环中。我将传入的数据组织成一个整数数组。现在我想让这个数组与我的其他类共享,这些类将使用这个数组执行不同的任务。我可以说,当串行事件侦听器在循环中运行并且数组不断变化时,我希望所有其他类共享这些变化的数组数据。我以前学过一些关于java.util.

我有一个串行端口,有数据输入。我用一个串口事件监听器实现了与RXTX库的串口连接。因此,只要串行端口中有可用的传入数据,同步函数serialEvent(SerialPortEvent-oEvent)就会运行。基本上,随着数据的不断输入,程序将处于无限循环中。我将传入的数据组织成一个整数数组。现在我想让这个数组与我的其他类共享,这些类将使用这个数组执行不同的任务。我可以说,当串行事件侦听器在循环中运行并且数组不断变化时,我希望所有其他类共享这些变化的数组数据。我以前学过一些关于java.util.observables的知识。当我在线搜索时,我看到其他人使用sychronized()和notify()/notifyAll()在线程之间共享一个变量


我不知道哪一个是最好的使用?如果他们都在这种情况下工作,我需要知道的最重要的部分是什么?还有其他方法可以实现我的目标吗

你的问题非常不清楚,但我可以给你一条一般性的建议

使用串行端口对象的简单方法是打开输入或输出流,只读取/写入字节。事件内容适用于不希望线程阻塞等待读取数据的情况

我建议您通读这些内容,特别是前两篇阐述了基于流和基于事件的方法

如果这没有帮助,请使用一些Java代码或伪代码更新问题,以解释您尝试执行的操作

跟进

从您的“答案”判断,您似乎误解了
synchronized
的功能。简单地说,它只是阻止两个线程同时执行某些代码区域

您的问题还涉及一个线程以某种方式告诉另一个线程新数据已经到达,需要处理。而且,您还遇到了一个问题,即在第一个线程用下一个数据块覆盖数据之前,必须对数据进行处理


我建议您从阅读上的Java教程流开始。这可能不会直接解决您的问题,但它应该让您开始以正确的方式思考问题。

如果没有有关应用程序的其他信息,就很难判断问题。当你说“其他类”时,你是指“其他线程”吗

如果您的其他类是线程,并且您希望它们等待新数据,则可以让它们
wait()
并让串行端口事件侦听器
notifyAll()
,只要新数据可用。这将唤醒正在等待的线程。但是请注意,这只解决了通知问题:您仍然需要处理对数据数组的并发访问,因为在其他线程访问数据时,新数据可能会到达

另一方面,如果使用
Observable
,那么当调用
Observable.notifyObservators()
,这将导致调用每个
Observable
update()
方法,所有这些都在当前线程(调用
Observable.notifyObservators()
的线程)的上下文中。如果希望其他线程访问数据,则仍然需要某种方式通知它们(例如,您的
update()
方法可能最终实际调用
notify()


如果您提供更多关于您正在尝试做什么的信息,我们可能会进一步帮助您。

很抱歉,我的问题不清楚。我应该给出一些代码 我和你一起工作。请参阅以下链接:

基本上,这个示例代码不同于经典的rxtx示例,它通过在某些函数上声明“synchronized”关键字,在串行端口上进行基于事件的通信。 我正在处理的唯一部分是在串行事件侦听器中:

public synchronized void serialEvent(SerialPortEvent oEvent) {

    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            ////////////////////////////////////
            1) I will parse the incoming data into an integer array
            2) this array will be shared with other classes, let me
              explain some of them below.....
            ////////////////////////////////////
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
}
功能A:使用此共享阵列中的数据进行2D/3D图形的小程序

功能B:GUI将从共享数组中计算出的一些数字输出/打印到jframe中的文本区域。它还可以打开一个带有按钮的小程序。但是GUI中的一些按钮会更改函数A中的一些变量,从而导致函数A处理共享数组的不同行为

这就是我想要的:

当串行数据进入并解析到数据数组中时

1) 函数B将立即打印与此数据数组关联的数字。仅当用户单击按钮以显示函数A小程序时,函数A才会显示2D/3D图形

2) 当函数A和B都处于活动状态时,它们自己的变量会随着输入的串行数据而变化

我希望函数A和B立即捕获共享数据数组中的更改,因为它在serialEvent()中发生了更改。我知道最简单的方法是将数据数组作为引用传递,并在下一个传入数据可用之前调用每个函数。但是有一个问题是格罗德里格斯前面提到的。在执行函数A或B时,可能会丢失一些传入数据。几年前我在java中做了一些关于MVC的事情,它在不同的类或GUI之间使用obervables来显示温度。就像我在文本框中输入温度一样,另一个带有滑块的GUI将更改为输入温度。当我在这里更改滑块时,它将在另一个GUI中更改温度的数值。串行事件使我想起了这里的应用程序。我不确定这是否是在这里应用的最好方法,或者有其他更好更简单的方法来做我想要的事情


再次感谢您的耐心。

不要将后续内容作为答案发布。如果你想让人们注意到你的问题,请使用评论。你能编辑你的问题以包括附加的i吗