- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
介绍:
我想创建一个多线程 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/
当返回值不感兴趣时,AtomicInteger.getAndIncrement() 之间是否有任何(甚至在实践中不相关)差异?和 AtomicInteger.incrementAndGet()方法
有没有AtomicInteger.accumulateAndGet()不能用AtomicInteger.updateAndGet()代替的场景,还是只是为了方便方法引用? 这是一个简单的示例,我没有看
我对java中的并发数据结构有疑问,特别是: 1) ConcurrentHashMap 2) HashMap 3) ConcurrentHashMap 如果我理解正确的话: 1) 读/写是线程安全的,
我怎样才能实现这里的 while 循环总是精确执行 100 次。当我执行代码时,在极少数情况下它会在控制台上打印 99 或 98 行而不总是 100,我不明白。 import java.util.Ar
我从原子学教程中获取这段代码,它说:- "By using AtomicInteger as a replacement for Integer we're able to increment the
我正在尝试为我的 Libgdx 游戏创建一个简单的十秒倒计时器。我创建了一个 timekeep 类,它实现了 runnable 并且可以很好地执行十秒倒计时。然而,我想打印这个 Timer 变量,因为
如果两个线程都使用 i++ 递增相同的 int i,我们可能会遇到问题,因为 i++ 不是原子操作。这就是为什么有 AtomicInteger.increment(),它使递增原子化。因此,如果我们有
我已经阅读了 java.util.concurrent 包的 API 文档,但显然误解了一些内容。概述说 A small toolkit of classes that support lock-fr
是否 AtomicInteger提供任何形式的公平保证?像先到先服务的线程执行顺序就可以了? Victor Grazi's concurrent animated 上的动画示例绝对没有表现出任何这样的
我有一个类,它在各自的线程上创建许多新对象,我想保持跨线程的运行计数。我想要一个 AtomicInteger 但它没有达到我的预期,而只是得到了一个较小的版本。我假设这是一个竞争条件错误 - 但我不完
为什么在AtomicInteger或另一个Atomic类中定义了这个set方法? 示例代码: /** * Sets to the given value. * * @param newValu
我怀疑下面是否是线程安全的, // is this thread safe, final int MAX_COUNT = 3 ? if (retryCount.get() < MAX_COUNT) {
我正在阅读一些关于 Java 中的原子变量的文档。正如到处都写的那样,AtomicInteger 应该是线程安全的。 根据我对原子整数的理解,它的工作原理是比较和交换算法。当两个线程试图在完全相同的时
import java.util.concurrent.atomic.AtomicInteger; public class Volatiletest extends Thread { pri
AtomicIntegers 被认为是同步原语,还是它只是 Java 提供的方法(wait()、notify() 等)。 我对基元的定义感到困惑,因为原子整数可以对 int 进行操作并提供无锁线程 s
public class SynchroExample { public final AtomicInteger integer = new AtomicInteger(0); priva
我有一个 android 客户端,它将与服务器建立 Http 连接。 服务器要求所有的Http请求在Http头中提供一个单调递增的计数器。例如 POST /foo/server X-count: 43
我读到过使用原子包类使我们能够进行线程安全、更少锁定的编码。但是我不太确定原子包类中的方法如何在不使用锁或任何同步关键字的情况下提供线程安全。任何帮助都将不胜感激。 最佳答案 他们使用非常低级的指令,
我想实现一个共享对象来计算操作执行的统计信息。对象状态将由 Map 表示(键是操作的名称,值是操作执行的次数)。我可以选择 HashMap 是否正确?由于 AtomicInteger 具有 volat
我想找出从 0 到 1000000 的所有质数。为此我写了这个愚蠢的方法: public static boolean isPrime(int n) { for(int i = 2; i <
我是一名优秀的程序员,十分优秀!