【问题标题】:How to get a fixed sized Queue如何获得固定大小的队列
【发布时间】:2016-10-20 07:42:53
【问题描述】:

我正在尝试在 java 中创建一个固定大小的队列,我只想在队列中存储最多 10 个对象。但是,队列继续存储/添加对象并忽略if 条件。

我的代码:

Queue<Customer> sitt = new LinkedList<Customer>();
if(sitt.size() < 10) {
System.out.println("Added");
((LinkedList<Customer>)sitt).offer(cust); 
}else {
System.out.println("No space..");
}

我有另一个 Runnable 类,我正在运行 22 个线程。此条件应仅添加 Customer 类的 0-9 对象。但是,sitt.size() 甚至超过 20。谁能告诉我这里有什么问题?甚至if 条件也被忽略了。

P.S:我在这里使用 Queue 的原因是因为我需要 FIFO。

【问题讨论】:

  • 为什么要使用 LinkedList?一个简单的循环缓冲区也可以工作
  • 由于您处于多线程场景中,因此您应该将 if 条件和添加到同步块中。也许其他线程在其他线程添加元素之前检查队列大小。
  • @Karura91 是的,它在同步块内。 Added 打印了 22 次。和sitt.size() 继续增加而不是停止它 10。@Domso 我将检查循环缓冲区。 @Stefan 我已经在使用 LinkedList 的这种队列方式,但它忽略了 if 条件。
  • @Nix 我看不出这段代码有什么问题。你也可以发布与同步相关的代码吗?

标签: java multithreading java.util.concurrent


【解决方案1】:

您可以只使用java.util.concurrent 中的LinkedBlockingQueue - 它允许您指定队列的固定大小。

new LinkedBlockingQueue<>(10);

然后您可以使用 offer() 方法将值插入其中,如果队列已满,该方法将不执行任何操作并返回 false

【讨论】:

  • 或 ArrayBlockingQueue 或 ConcurrentLinkedDeque 或 ConcurrentArrayQueue 或 ArrayDeque 或 LinkedBlockingDeque +1
  • 感谢您的建议,我将尝试所有这些。然而,LinkedBlockingQueue(10);没有解决问题。我将用完整的代码更新我的问题。
  • @Nix 不看代码我假设您正在处理不同的队列实例。也就是说 - 您可能会将项目添加到一个队列,但错误地检查了另一个队列的大小。
猜你喜欢
  • 2019-10-13
  • 2012-07-20
  • 1970-01-01
  • 2016-07-19
  • 2012-09-09
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多