java - 当我想从其头部删除消息时,如何在java中正确使用BlockingQueue

标签 java multithreading concurrency

我正在为 Android 编写处理实时数据的应用程序。 我的应用程序从数据总线(CAN)读取二进制数据,解析并将其显示在屏幕上。 应用程序在后台线程中读取数据。需要将数据从一个线程快速传输到另一个线程。显示的数据应该是最真实的。

我发现了一个很好的 java 队列,它几乎实现了所需的行为:LinkedBlockingQueue。我计划为此队列设置强限制(大约 100 条消息)。

消费者线程应该使用 take() 方法从队列中读取数据。但生产者线程不能等待消费者。因此它不能使用标准方法 put() (因为它是阻塞的)。

因此,我计划使用以下结构将消息放入队列:

while (!messageQueue.offer(message)) {
    messageQueue.poll();
}

也就是说,应该从队列中删除最旧的消息,以便为新的实际数据提供位置。

这是一个好的做法吗?或者我丢失了一些重要的细节?

最佳答案

看不出有什么问题。你知道你在做什么(失去头记录)。这与任何实践无关;您可以根据自己的需要选择使用 api。不过,我个人更喜欢 ArrayBlockingQueue(临时对象较少)。

关于java - 当我想从其头部删除消息时,如何在java中正确使用BlockingQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49897484/

相关文章:

java - Spring MVC Controller : what is the difference between "return forward", "return redirect"和 "return jsp file"

multithreading - 使用 Stanford CoreNLP (3.5.2) 进行并发处理

java - 同步块(synchronized block)中的操作对其他线程可见吗?

python - concurrent.futures.ProcessPoolExecutor 与 multiprocessing.pool.Pool

c - C linux 命名信号量和flock哪个更好

java - android(Java/XML) 代码中的注释会影响 APK 的大小吗?

Java 数字签名相关文件(MANIFEST.MF、*.SF、*.DSA)及其内容?

java - ListView 致命异常 : main java. lang.NullPointerException

android - 没有IPC的Android进程默认有Binder线程池吗?

c# - 如何处理 Task.Run 异常