Android:连续SQL插入的阻塞或非阻塞队列?

时间:2016-03-30 10:19:23

标签: java android multithreading queue blockingqueue

我有一个应用程序,按下“开始”按钮后,服务将开始轮询一些传感器,每当传感器值发生变化时,将传感器数据存储到某个对象中。每隔10ms,就会发生一个数据库插入,它接受对象的当前值并将它们存储到数据库中。这种情况发生了30分钟

考虑到插入的速度和持续时间,我想在UI线程的单独线程中运行它,因此导航不会受到影响。所以我的服务会通过将其添加到队列中来为线程提供一些数据,然后另一个线程(使用者)将从队列中获取并插入到数据库中

当按下停止按钮时,我需要确保在杀死线程之前处理队列的其余部分。

似乎在我看的每个地方,建议在生产者/消费者类型情况下使用某种阻塞队列(例如LinkedBlockingQueue vs ConcurrentLinkedQueueWhat's the different between LinkedBlockingQueue and ConcurrentLinkedQueue?

我的问题是,在我的情况下阻塞队列是否有意义?

此应用中至关重要的是,所有数据都会插入到数据库中。根据我的理解(如果我错了,请纠正我),但如果队列变满,并且消费者线程不能足够快地插入以释放更多队列空间,那么生产者将被阻止将东西添加到队列中?如果那时候时间队列中有空闲空间,那么一些传感器读数就会消失,并且由于阻塞而不会将它们插入到数据库中

在一天结束时,我只需要最好的方法来确保数据每10毫秒插入一次而不会跳过一个节拍。在我看来,每10毫秒将值转储到一些无限的,无限制的队列中是有意义的,并且让消费者一旦能够对其进行轮询。然后当按下Stop时,在杀死线程之前排空队列的其余部分。

那么在1个生产者/ 1个消费者的情况下处理这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

如果我是你,我会使用单个线程执行程序来执行此任务 - 它已经具有开箱即用的确切功能。更多信息here