介绍:
我想创建一个多线程的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类型的对象不再有用。