【问题标题】:shared data for multi thread in javajava中多线程的共享数据
【发布时间】:2012-01-19 07:47:36
【问题描述】:

当我在 android 上编写一个用于实时监测心电图的程序时,我遇到了一个问题。 心电数据通过udp实时传输到手机。在移动设备中,有 2 个线程:一个线程获取传输的心电数据,一个线程绘制心电数据。 循环缓冲区是上面两个线程的公共数据,两个线程在读取和写入缓冲区时总是冲突。结果是心电图丢失或变慢。 在用户 cicurlar 缓冲区之前,我使用了 5 个linkedblockingqueu,但结果是一样的。

谁能为我的程序中的多线程数据提供一些解决方案? 谢谢。

对不起,我的英文不好!

当我使用linkedblockingqueue时有模型:

【问题讨论】:

  • 不错的图表,但代码会更有用...另外,您需要提出一个同步策略。
  • ECG 数据是零散传输的还是队列中的单个对象足以绘制它?
  • 队列中的对象是坐标(x,y)的float[],用于绘制心电图。

标签: java multithreading real-time


【解决方案1】:

您需要使用共享锁同步对数据的访问。如果您想真正了解 Java 中的线程和并发模型,我强烈推荐 Java Concurrency in Practice

【讨论】:

  • 我使用的 cicurlar 缓冲区已经实现了同步,所以我认为还有一些其他问题。有它的来源:实现对象的循环缓冲区生产者/消费者模型。 * 有关此课程的更多信息,请访问ostermiller.org/utils/CircularObjectBuffer.html
【解决方案2】:

我认为,Synchronization 是您问题的解决方案。

线程主要通过 共享对字段的访问权限和 对象引用字段引用。 这种沟通形式是 效率极高,但会产生两个 可能的错误种类:线程 干扰和记忆一致性 错误。预防所需的工具 这些错误是同步的。

来自 JavaDoc 的 BlockingQueue

BlockingQueue 的实现是 线程安全的。所有排队方法 使用原子地实现它们的效果 内部锁或其他形式的 并发控制。然而,大宗 集合操作 addAll, containsAll、retainAll 和 removeAll 不一定执行 除非另有说明,否则原子地 在一个实现中。所以它是 可能的,例如,对于 addAll(c) 之后失败(抛出异常) 只添加 c 中的部分元素。

【讨论】:

    【解决方案3】:

    在我的假设中,您直接访问集合(基于任何 Fifo),您必须尝试创建一个 bean,该 bean 应该具有用于​​数据而不是用于集合的 getter 和 setter,并且集合应该在 bean 中定义。您可以在创建线程对象之前创建 bean 对象,并在构建时将 bean 对象传递给线程,希望这对您有所帮助。

    【讨论】:

    • 你能写得更详细些吗?什么是 bean 对象及其作用?
    猜你喜欢
    • 2011-07-08
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多