介绍:

我想创建一个多线程的android应用。我的问题是线程之间的通信。我了解了线程之间的通信,并且遇到了诸如Looper/Handler设计之类的东西,看起来很复杂,还有诸如AtomicInteger之类的Atomic Variables。现在,我使用AtomicInteger进行通信,但是由于我对Java没有很丰富的经验,因此不确定在我的情况下是否不好/是否有针对我特定目的的更好的解决方案。当我注意到我实际上需要像AtomicFloat之类的东西时,我也对我的方法有些怀疑,但是它不存在。我觉得我在滥用这个概念。我还发现您可以将自己设置为AtomicFloat,但是我不确定我是否使用正确的方法或是否有更好的技术。

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

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

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

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

AtomicFloat gyro_z,AtomicFloat gyro_y, ...

2.CommunicationThread:与PC进行通信,解释来自套接字的命令,并根据AtomicInteger设置应用程序的状态:
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类型的对象不再有用。

10-08 15:30