高频运行的3个线程使用相同的变量

时间:2015-09-11 20:42:37

标签: android concurrency android-handler java-threads android-ble

我正在开发一个Android应用程序,它以高频率接收来自ble通知的数据,在屏幕上打印数据并将数据发送到其他外设。

这是我的情况:

  1. onCharacteristicChanged回调接收一个名为的字节数组 在10hz“”并在一些float和int变量中解压缩数据

  2. 与handlerThread关联的处理程序启动Runnable     每30hz。此runnable使用从解压缩的变量,     将新数据保存在一些变量中并将sendbroadcastmessage保存到     UX

  3. 另一个每10hz的线程使用保存的数据         步骤1和2对此变量进行一些数学运算并写入         关于特征的数据。
  4. 在上面的步骤中,我保存并使用float,double和int变量。

    我害怕处理并发性,我正在考虑在步骤2和3中使用相同的handletraread来解决并发问题。但是当另一个通知到达时,我认为存在种族争议问题:/ < / p>

    其他问题: oncharacteristicchanged在执行什么线程?

    有关我的问题的更多信息: 在oncharacteristicchanged到新的字节数组(在10hz频率),我在变量中解包数据,在其他线程B(在30hz)使用这个数据做一些计算:sendbroadcast到ux并将结果保存在其他一些变量中;线程C使用线程B的结果,它做了一些其他的计算并在10hz处写入特性。

    oncharacteristicchanged - &gt;线程B - &gt;线程C

    但是我不能停止特征改变,因为我不知道它在哪个线程中执行..

1 个答案:

答案 0 :(得分:1)

我不了解Android,但我做的是Java。我会尝试帮助你甚至不知道Android,所以让我们走吧!

&#34;在上面的步骤中,我保存并使用float,double和int变量。&#34;

首先,我开始使用线程安全变量,例如:AtomicInteger或将它们声明为volatile。

对于将通过多线程访问的所有方法,我要说它们使线程安全。我不知道在Android中是否有类Lock或关键字synchronized,但我从那里开始。

示例:

Lock lock = new ReentrantLock();
try  {
    lock.lock();
    doYourWork();
} finally{
    lock.unlock();
}

这是开始的方式......希望我帮助你一点甚至不知道Android,对不起,如果我说错了。