当前位置: 首页 > 知识库问答 >
问题:

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

马安邦
2023-03-14

我有一个应用程序,在其中按下开始按钮后,服务将开始轮询几个传感器,每当传感器值发生变化时,将传感器数据存储到某个对象中。每10毫秒,就会发生一次数据库插入,获取对象的当前值并将其存储到数据库中。这会发生30分钟

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

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

似乎在我所看到的任何地方,生产者/消费者类型的情况下都建议使用某种阻塞队列(例如LinkedBlockingQueue与ConcurrentLinkedQueue,或者LinkedBlockedQueue和Concurrent LinkedQueee有什么不同?)

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

这个应用程序中最重要的事情是所有数据都插入到数据库中。据我了解(如果我错了,请纠正我),但是如果队列已满,并且使用者线程无法足够快地进行插入以释放更多队列空间,那么生产者被阻止向队列html" target="_blank">添加内容?如果是这样,那么在队列时有可用空间时,一些传感器读数会经过,并且由于阻塞,它们不会插入数据库

说到底,我只需要最好的方法来确保每10ms插入一次数据,而不会遗漏任何一个节拍。在我看来,每隔10毫秒将这些值转储到某个无限的队列中,并让消费者尽可能快地轮询它是有意义的。然后,当按下Stop时,在终止线程之前清空队列的剩余部分。

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

共有1个答案

高晋
2023-03-14

如果我是你,我会为这个任务使用一个线程执行器——它已经具备了你开箱即用所需的确切功能。更多信息请点击此处。

 类似资料:
  • 问题内容: 我在一个非常简单的生产者-消费者场景中使用 java.util.concurrent.BlockingQueue 。例如,此伪代码描述了使用者部分: 到目前为止,一切都很好。在阻塞队列的javadoc中,我读到: BlockingQueue本质上不支持任何类型的“关闭”或“关闭”操作,以指示将不再添加任何项目。这些功能的需求和使用往往取决于实现。例如,一种常见的策略是让生产者插入特殊的

  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser

  • Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S

  • 我编写了一个简单的类,我计划将其扩展为客户端套接字编程应用程序的一部分。类涉及一个BlockingQueue(我从这里复制了代码:相当于Java的BlockingQueue的C++)。当我创建了下面的包装类的一个实例后,我打算让它生成一个单独的线程,该线程只需执行BlockingQueue上阻塞的printer()函数,直到有一个或多个字符串可用,然后它只需将字符串打印到控制台窗口。在我的预期应用

  • blpop key1...keyN timeout 从左到右扫描返回对第一个非空list进行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。当阻塞时,如果有client对ke

  • 问题内容: 我有这段代码可以在Linux中从Serial读取,但是我不知道在读取SerialPort时阻塞和非阻塞之间有什么区别,在哪种情况下哪个更好? 问题答案: 您提到的代码是IMO编码和注释不当的代码。该代码不符合POSIX的可移植性惯例,如正确设置终端模式和POSIX操作系统的串行编程指南中所述。该代码没有提到它使用非规范(也称为原始)模式,并且重用了“阻塞”和“非阻塞”术语来描述 VMI