【发布时间】:2016-07-18 06:51:57
【问题描述】:
我有一个应用程序,在按下“开始”按钮后,将启动一项服务,该服务将轮询几个传感器,并在传感器值发生变化时将传感器数据存储到某个对象中。每隔 10 毫秒,就会发生一次数据库插入,它将对象的当前值存储到数据库中。这会持续 30 分钟
考虑到插入的速度和持续时间,我想在与 UI 线程不同的线程中运行它,这样导航就不会受到影响。所以我的服务会通过将一些数据添加到队列中来向线程提供一些数据,然后另一个线程(消费者)将从队列中取出并插入数据库
当按下停止按钮时,我需要确保在终止线程之前处理队列的其余部分。
似乎在我所看到的任何地方,都建议在生产者/消费者类型的情况下使用某种阻塞队列(例如 LinkedBlockingQueue vs ConcurrentLinkedQueue 或 What's the different between LinkedBlockingQueue and ConcurrentLinkedQueue?)
我的问题是,阻塞队列在我的情况下有意义吗?
这个应用程序中最最重要的事情是所有数据都被插入到数据库中。据我了解(如果我错了,请纠正我),但是如果队列已满,并且消费者线程无法足够快地进行插入以释放更多队列空间,则生产者将被阻止向队列?如果这是正确的,那么到时间队列有可用空间时,一些传感器读数会过去,并且由于阻塞,它们不会被插入到数据库中
归根结底,我只需要最好的方法来确保每 10 毫秒插入一次数据而不会跳过一个节拍。在我看来,每 10 毫秒将值转储到一些无限制的无限队列中,并让消费者尽快轮询它是有意义的。然后当按下 Stop 时,在终止线程之前清空队列的其余部分。
那么在 1 个生产者/1 个消费者的情况下处理这个问题的正确方法是什么?
【问题讨论】:
标签: java android multithreading queue blockingqueue