首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:观察者或串行端口上的synchronized+notify()传入数据

Java:观察者或串行端口上的synchronized+notify()传入数据
EN

Stack Overflow用户
提问于 2010-11-05 18:17:58
回答 3查看 3.2K关注 0票数 1

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

我不确定哪一个是最好的使用?如果它们在这种情况下都可以工作,那么我需要注意的最重要的部分是什么?还有没有其他方法可以达到我想要的效果?

EN

回答 3

Stack Overflow用户

发布于 2010-11-05 18:51:41

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

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

我建议您通读这些RXTX examples,尤其是说明基于流和基于事件的方法的前两篇文章。

如果这样还不能解决问题,请使用一些Java代码或伪代码来更新问题,以解释您正在尝试执行的操作。

后续

从你的“回答”来看,你似乎误解了synchronized的作用。简单地说,它只是停止两个线程同时执行某些区域的代码。

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

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

票数 0
EN

Stack Overflow用户

发布于 2010-11-05 21:01:01

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

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

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

如果您提供有关您正在尝试执行的操作的更多信息,我们可能会进一步帮助您。

票数 0
EN

Stack Overflow用户

发布于 2010-11-06 08:07:54

很抱歉,我的问题不是很清楚。我应该给出一些我正在使用的代码。请参阅以下链接:

http://www.arduino.cc/playground/Interfacing/Java

基本上,这个示例代码不同于那些经典的rxtx示例,通过在一些函数上声明"synchronized“关键字,在串行端口上进行基于事件的通信。

代码语言:javascript
复制
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中的文本区域。它还可以用一个按钮打开函数A小程序。但是GUI中的一些按钮会改变函数A中的一些变量,从而导致不同的行为来处理函数A共享的数组。

这就是我想要的:

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

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

2)当函数A和B都激活时,它们自己的变量会随着输入的串行数据而发生变化。

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

再次感谢您的耐心等待。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4105000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档