Android:连续 SQL 插入的阻塞或非阻塞队列?
Android: blocking or non-blocking queue for continuous SQL inserts?
我有一个应用程序,按下“开始”按钮后,将启动一项服务,该服务会轮询一些传感器,并在传感器值发生变化时将传感器数据存储到某个对象中。每隔 10 毫秒,就会发生一次数据库插入,将对象的当前值存储到数据库中。这种情况持续了 30 分钟
考虑到插入的速度和持续时间,我想 运行 在与 UI 线程不同的线程中进行此操作,这样导航就不会受到影响。所以我的服务将通过将一些数据添加到队列来向线程提供一些数据,然后另一个线程(消费者)将从队列中取出并插入数据库
按下“停止”按钮时,我需要确保在终止线程之前处理完队列的其余部分。
似乎在我看来的任何地方,都建议在 producer/consumer 类型的情况下使用某种阻塞队列(例如 LinkedBlockingQueue vs ConcurrentLinkedQueue, or What's the different between LinkedBlockingQueue and ConcurrentLinkedQueue?)
我的问题是,阻塞队列在我的情况下有意义吗?
这个应用程序中最最重要的是所有数据都被插入到数据库中。据我了解(如果我错了,请纠正我),但是如果队列已满,并且消费者线程无法足够快地进行插入以释放更多队列 space,那么生产者将被阻止向队列中添加东西?如果那是正确的,那么到时间队列有空闲 space,一些传感器读数会过去,并且由于阻塞
,它们不会被插入数据库
归根结底,我只需要最好的方法来确保每 10 毫秒插入一次数据而不会跳过一个节拍。在我看来,每 10 毫秒将值转储到一些无限制的、无限的队列中,并让消费者尽快轮询它是有意义的。然后当按下 Stop 时,在杀死线程之前清空队列的其余部分。
那么在 1 producer/1 消费者情况下处理这个问题的正确方法是什么?
如果我是你,我会使用单线程执行器来完成这项任务——它已经具备了你需要的开箱即用的功能。更多信息 here.
我有一个应用程序,按下“开始”按钮后,将启动一项服务,该服务会轮询一些传感器,并在传感器值发生变化时将传感器数据存储到某个对象中。每隔 10 毫秒,就会发生一次数据库插入,将对象的当前值存储到数据库中。这种情况持续了 30 分钟
考虑到插入的速度和持续时间,我想 运行 在与 UI 线程不同的线程中进行此操作,这样导航就不会受到影响。所以我的服务将通过将一些数据添加到队列来向线程提供一些数据,然后另一个线程(消费者)将从队列中取出并插入数据库
按下“停止”按钮时,我需要确保在终止线程之前处理完队列的其余部分。
似乎在我看来的任何地方,都建议在 producer/consumer 类型的情况下使用某种阻塞队列(例如 LinkedBlockingQueue vs ConcurrentLinkedQueue, or What's the different between LinkedBlockingQueue and ConcurrentLinkedQueue?)
我的问题是,阻塞队列在我的情况下有意义吗?
这个应用程序中最最重要的是所有数据都被插入到数据库中。据我了解(如果我错了,请纠正我),但是如果队列已满,并且消费者线程无法足够快地进行插入以释放更多队列 space,那么生产者将被阻止向队列中添加东西?如果那是正确的,那么到时间队列有空闲 space,一些传感器读数会过去,并且由于阻塞
,它们不会被插入数据库归根结底,我只需要最好的方法来确保每 10 毫秒插入一次数据而不会跳过一个节拍。在我看来,每 10 毫秒将值转储到一些无限制的、无限的队列中,并让消费者尽快轮询它是有意义的。然后当按下 Stop 时,在杀死线程之前清空队列的其余部分。
那么在 1 producer/1 消费者情况下处理这个问题的正确方法是什么?
如果我是你,我会使用单线程执行器来完成这项任务——它已经具备了你需要的开箱即用的功能。更多信息 here.