Java 如何获得固定大小的队列

Java 如何获得固定大小的队列,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,我试图用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

我试图用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..");
}
我还有一个可运行的类,我正在运行22个线程。此条件应仅添加0-9个Customer类对象。然而,座位的大小甚至超过了20个。谁能告诉我这里有什么问题吗?即使if条件被忽略

注意:我之所以在这里使用队列,是因为我需要FIFO。

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

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

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

new LinkedBlockingQueue<>(10);

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

为什么要使用LinkedList?一个简单的循环缓冲区可以工作,因为您处于多线程场景中,所以应该将if条件和添加放入一个同步块中。可能其他线程在其他线程添加其元素之前检查队列大小。@Karura91是的,它在同步块内。加上的指纹大概有22次。而且sitt.size不断增加,而不是停止10@Domso我将检查循环缓冲区@Stefan我已经在LinkedList中使用了这种队列方式,但它忽略了if条件。@Nix我看不出这段代码中有任何错误。你也可以发布与同步相关的代码吗?为什么要使用LinkedList?一个简单的循环缓冲区可以工作,因为您处于多线程场景中,所以应该将if条件和添加放入一个同步块中。可能其他线程在其他线程添加其元素之前检查队列大小。@Karura91是的,它在同步块内。加上的指纹大概有22次。而且sitt.size不断增加,而不是停止10@Domso我将检查循环缓冲区@Stefan我已经在LinkedList中使用了这种队列方式,但它忽略了if条件。@Nix我看不出这段代码中有任何错误。您是否也可以发布与同步相关的代码?或者ArrayBlockingQueue或ConcurrentLinkedQueue或ConcurrentArrayQueue或ArrayQueue或LinkedBlockingDeque+1谢谢您的建议,我将尝试所有这些。然而,LinkedBlockingQueue10;没有解决问题。我将用完整的代码更新我的问题。@Nix不看代码,我假设您正在处理不同的队列实例。也就是说,您可能会将项目添加到一个队列中,但错误地检查了另一个队列的大小。或者ArrayBlockingQueue或ConcurrentLinkedQueue或ConcurrentArrayQueue或ArrayQueue或LinkedBlockingDeque+1感谢您的建议,我将尝试所有这些。然而,LinkedBlockingQueue10;没有解决问题。我将用完整的代码更新我的问题。@Nix不看代码,我假设您正在处理不同的队列实例。也就是说,您可以将项目添加到一个队列中,但错误地检查了另一个队列的大小。