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

时间:2018-04-18 10:32:32

标签: java multithreading concurrency

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

我找到了几乎实现所需行为的好java队列:LinkedBlockingQueue。我计划为这个队列设置强大的限制(大约100条消息)。

Consumer线程应该使用take()方法从队列中读取数据。但生产者线程不能等待消费者。由于这个原因,它不能使用标准方法put()(因为它阻塞)。

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

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

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

这是一个好习惯吗?或者我丢失了一些重要细节?

2 个答案:

答案 0 :(得分:0)

Can't see anything wrong with it. You know what you are doing (loosing the head record). This can't relate to any practice; it's your call to use the api like you want. I personally prefer ArrayBlockingQueue though (less temp objects).

答案 1 :(得分:0)

这应该是您正在寻找的内容:Size-limited queue that holds last N elements in Java

最佳答案是指一个将删除元素的apache lib队列。