【问题标题】:Multiple Thread Variable Access多线程变量访问
【发布时间】:2012-12-11 05:51:03
【问题描述】:

我正在运行两个单独的线程(Android SDK),一个是主线程,另一个是计算数字输入传感器上状态变化的数量。我希望访问主线程中的状态更改计数以将数据发送到其他地方。我是否能够暂停传感器线程,使用 getter 传递值,然后恢复线程?我还想在采样后重置计数器(使用设置器?)。

实现这一点的最佳做法是什么?

【问题讨论】:

  • 计算数字输入传感器状态变化次数的线程是如何工作的?它会定期休眠,还是传感器会以某种方式通知它?
  • wait()sleep()
  • 它等待一个高值。然后添加到计数器。然后重复

标签: java android multithreading


【解决方案1】:

这类似于生产者消费者问题。您可以有一个单一长度的阻塞队列。

主线程——消费者

其他线程(计算状态变化)--producer

Java API 解决生产者消费者问题: BlockingQueue

在其他线程中读取值,并将其放入 BlockingQueue(size 1)。主线程将检查队列并读取值。读取值后,“其他线程”可以再次放入新值。这将保证您的值被主线程读取然后重置。

API:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html

【讨论】:

    【解决方案2】:

    如果计数是int,您可以直接从主线程访问它而不会出现问题。

    【讨论】:

    • 你是一个 int,但我必须锁定它吗?
    • 无需锁定 int。递增 int 是一种原子操作,您将在读取时获得正确的值(与并发更新的正确值一样多......)
    【解决方案3】:

    你应该使用同步的关键字,它可以保证你的代码在同一时间只被一个线程访问。 这是一个包含更多详细信息的链接,描述了与您类似的用例:http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多