[英]Java: Observer or synchronized+notify() on a serial port incoming data
我有一个带有数据输入的串行端口。我通过一个串行端口事件监听器实现了与RXTX库的串行端口连接。 因此,只要串行端口中有可用的传入数据,同步功能serialEvent(SerialPortEvent oEvent)就会运行。 基本上,随着数据不断进入,程序将处于无限循环中。 我将传入的数据组织成一个整数数组。 现在,我希望将此数组与其他类共享,这些其他类将使该数组执行不同的任务。 我可以说,由于串行事件侦听器循环运行且数组不断变化,我希望所有其他类共享此更改后的数组数据。 我以前学过一些有关java.util.observables的知识。 当我在线搜索时,我看到其他人使用sychronized()和notify()/ notifyAll()在线程之间共享变量。
我不确定哪一种最适合使用? 如果它们都在这种情况下起作用,那么我需要了解的最重要部分是什么? 还有其他方法可以实现我想要的吗?
您的问题非常不清楚,但是我可以给您一个一般性建议。
使用串行端口对象的简单方法是打开输入或输出流,仅读取/写入字节。 该事件材料适用于您不希望线程阻塞等待读取数据的情况。
我建议您通读这些RXTX示例 ,尤其是前两个示例 ,它们说明了基于流和事件的方法。
如果这样做没有帮助,请使用一些Java代码或伪代码更新问题,以解释您要尝试执行的操作。
跟进
从您的“答案”来看,您似乎误解了synchronized
含义。 简单地说,它只是停止两个线程同时执行某些代码区域。
您的问题还涉及一个线程以某种方式告诉另一个线程新数据已经到达并且需要处理。 而且,您还遇到一个问题,在第一个线程用下一个数据块覆盖数据之前,必须先处理数据。
我建议您先阅读Concurrency上的Java Tutorial流。 这可能不会直接解决您的问题,但是它应该使您开始以正确的方式考虑问题。
如果没有有关您的应用程序的其他信息,这很难分辨。 当您说“其他类”时,您是说“其他线程”吗?
如果其他类是线程,并且希望它们等待新数据,则可以让它们使用wait()
并在有新数据可用时让您的串行端口事件侦听器notifyAll()
。 这将唤醒正在等待的线程。 但是请注意,这只能解决通知:您仍将需要处理对数据数组的并发访问,因为有可能在其他线程正在访问新数据时到达新数据。
另一方面,如果使用Observable
,则在调用Observable.notifyObservers()
,这将导致在当前线程(正在调用Observable.notifyObservers()
的线程)的上下文中调用每个Observer
的update()
方法。 Observable.notifyObservers()
)。 如果您希望其他线程访问数据,则仍然需要某种方式来通知它们(例如,您的update()
方法可能最终实际上是调用notify()
)。
如果您提供有关您要做什么的更多信息,我们也许可以为您提供进一步的帮助。
对不起,我的问题不清楚。 我应该提供一些正在使用的代码。 请参考以下链接:
http://www.arduino.cc/playground/Interinterface/Java
基本上,此示例代码与那些经典的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图形的applet。
功能B:GUI将在jframe中将从共享数组计算出的一些数字输出/打印到文本区域。 它还可以通过按钮打开功能A小程序。 但是GUI中有一些按钮会更改功能A中的某些变量,以引起不同的行为,以通过功能A处理共享阵列。
这就是我要的:
当串行数据进入并解析为数据数组时...
1)函数B将立即打印与此数据数组关联的数字。 仅当用户单击按钮以显示功能A小程序时,功能A才会显示2D / 3D图形。
2)当功能A和B都处于活动状态时,它们自己的变量可能会随着输入的串行数据而变化。
我希望函数A和B在serialEvent()中更改时立即捕获共享数据数组中的更改。 我知道最简单的方法是将数据数组作为引用传递,并在下一个传入数据可用之前调用每个函数。 但是存在Grodriguez先前提到的问题。 在执行功能A或B时,可能会丢失一些传入的数据。 几年前,我在Java中做了一些关于MVC的事情,它使用不同类或GUI之间的可观察对象来显示温度。 就像我在文本框中输入温度一样,带有滑块的其他GUI也会更改为输入温度。 当我在这里更改滑块时,它将在另一个GUI中更改数字的温度。 串行事件在这里使我想起了这个应用程序。 我不确定这是否是应用此处的最佳方法,或者可能还有其他更好,更轻松的方法来完全满足我的需求。
再次感谢您的耐心配合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.