java - 多线程通信: how good is the use of Atomic Variables like AtomicInteger? 为什么没有AtomicFloat?

标签 java android multithreading

介绍:

我想创建一个多线程 Android 应用程序。我的问题是线程之间的通信。我阅读了有关线程之间的通信的内容,并且遇到了诸如 Looper/Handler 设计之类的东西,这似乎非常复杂,还有 AtomicInteger 之类的原子变量。现在,我使用 AtomicInteger 作为通信方式,但由于我在 Java 方面不是很有经验,所以我不确定这对我来说是否不好/是否有更好的解决方案来满足我的特定目的。当我注意到我实际上需要类似 AtomicFloat 的东西时,我对我的方法也有点怀疑,但它不存在。我觉得我误用了这个概念。我还发现你可以让自己成为一个 AtomicFloat,但我不确定我的方法是否正确,或者是否有更好的技术。

问题: 使用原子变量并为我的特定目的(如下所述)实现 AtomicFloat 是否可以/很好,或者是否有更好的方式来处理通信?

到目前为止使用 AtomicVariables 的应用程序的目的/架构:

我有 4 个线程,目的如下:

1.SensorThread:读取传感器数据并将最近的值保存在AtomicVariables中,如

AtomicFloat gyro_z,AtomicFloat gyro_y, ...

2.CommunicationThread:与 PC 通信,解释来自套接字的命令,并根据 AtomicInteger 设置应用程序的状态: 原子整数状态;

3.UIThread:显示当前传感器值 AtomicFloat gyro_z,AtomicFloat gyro_y,

4.ComputationThread:使用传感器值 AtomicFloat gyro_z,AtomicFloat gyro_y, ... 和状态 AtomicInteger state 执行计算并通过 USB 发送命令。

最佳答案

你基本上有一个读者-作者问题,有两个读者和(目前)只有一个作者。如果您只想在线程之间传递简单类型,AtomicInteger 或类似实现的 AtomicFloat 就可以了。

但是,一个更方便的解决方案是使用 ReadWriteLock 保护您读取或写入对象数据的代码,这将使您能够处理更复杂的数据类型:

例如:

private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); //the reentrant impl

....

public void readMethod() {

    readWriteLock.readLock().lock();

    try {
        //code that simply _reads_ your object
    } finally {
        readWriteLock.readLock().unlock();
    }

}

public void writeMethod() {

     readWriteLock.writeLock().lock();

     try {
        //... code that modifies your shared object / objects
     } finally {
         readWriteLock.writeLock().unlock();
     }
}

这将只启用“一个写入者”或“多个读取者”场景来访问您的共享对象。

这将使您能够使用如下所示的复杂类型:

public class SensorRead {

    public java.util.Date dateTimeForSample;

    public float value;

}

在使用这种数据类型时,您应该注意这两个字段是否以安全和原子方式设置和修改。 AtomicXXX 类型对象不再有用。

关于java - 多线程通信: how good is the use of Atomic Variables like AtomicInteger? 为什么没有AtomicFloat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12581332/

相关文章:

java - Javers MongoRepository 为 Boolean JsonPrimitive 抛出 IllegalArgumentException

java - Android 上带有 JMRTD 的外部 RFID 阅读器

android - paypal initWithAppID() 应该是什么?

multithreading - 不允许使用可变线程本地数据的别名

c++ - "mutex"和 "lock"有什么区别?

java - 如何将 PDF 转换为 XML

java - 覆盖 equals 方法不起作用

java - 与 Netty 一起使用时 Camel ServicePool 背后的逻辑

java - 单值映射 Java 的多个键

android - 是否可以在移动应用程序中放置一个 Facebook 点赞按钮,并且在使用时会喜欢我的网站网址?