- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
如何在 Java 中使用 ConcurrentLinkedQueue
?
使用这个LinkedQueue
,我需要担心队列中的并发吗?还是我只需要定义两个方法(一个从列表中检索元素,另一个将元素添加到列表中)?
注意:显然这两种方法必须同步。对吧?
编辑: 我想要做的是:我有一个类(在 Java 中),它具有一种从队列中检索项目的方法,而另一个类具有一种将项目添加到队列。从列表中添加和检索的项目是我自己的类的对象。
还有一个问题:我需要在remove方法中这样做吗:
while (queue.size() == 0){
wait();
queue.poll();
}
我只有一个消费者和一个生产者。
最佳答案
不,方法不需要同步,也不需要定义任何方法;它们已经在 ConcurrentLinkedQueue 中,只需使用它们。 ConcurrentLinkedQueue 在内部完成您需要的所有锁定和其他操作;您的生产者将数据添加到队列中,然后您的消费者轮询它。
首先,创建您的队列:
Queue<YourObject> queue = new ConcurrentLinkedQueue<YourObject>();
现在,无论您在哪里创建生产者/消费者对象,都可以传入队列,以便它们有地方放置对象(您可以为此使用 setter,但我更喜欢在构造函数中执行此类操作):
YourProducer producer = new YourProducer(queue);
和:
YourConsumer consumer = new YourConsumer(queue);
并在您的生产者中添加内容:
queue.offer(myObject);
然后从你的消费者中取出东西(如果队列是空的,poll() 将返回 null,所以检查一下):
YourObject myObject = queue.poll();
更多信息见the Javadoc
如果您需要阻止等待队列不为空,您可能需要使用 LinkedBlockingQueue ,并使用 take() 方法。但是,LinkedBlockingQueue 具有最大容量(默认为 Integer.MAX_VALUE,超过 20 亿),因此根据您的情况可能合适也可能不合适。
如果您只有一个线程将内容放入队列,而另一个线程将内容从队列中取出,则 ConcurrentLinkedQueue 可能是矫枉过正。当您可能有数百甚至数千个线程同时访问队列时,它更有用。您的需求可能会通过以下方式得到满足:
Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
这样做的一个优点是它锁定实例(队列),因此您可以在队列上同步以确保复合操作的原子性(正如 Jared 所解释的)。您不能使用 ConcurrentLinkedQueue 执行此操作,因为所有操作都是在没有锁定实例的情况下完成的(使用 java.util.concurrent.atomic 变量)。如果您想在队列为空时阻塞,则不需要这样做,因为 poll() 将在队列为空时简单地返回 null,而 poll() 是原子的。检查 poll() 是否返回 null。如果是,wait(),然后再试一次。无需锁定。
老实说,我只是使用 LinkedBlockingQueue。对于您的应用程序来说,它仍然是矫枉过正,但很有可能它会正常工作。如果性能不够(PROFILE!),您可以随时尝试其他方法,这意味着您不必处理任何同步的东西:
BlockingQueue<YourObject> queue = new LinkedBlockingQueue<YourObject>();
queue.put(myObject); // Blocks until queue isn't full.
YourObject myObject = queue.take(); // Blocks until queue isn't empty.
其他一切都是一样的。 Put 可能不会阻塞,因为您不太可能将 20 亿个对象放入队列中。
关于java - 如何使用 ConcurrentLinkedQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/616484/
我在迭代时更新ConcurrentLinkedQueue。理论上,该队列上的迭代器在到达队列末尾之前不应停止。但是,在我的程序中(如下所示),迭代器在迭代队列的初始状态(没有更新)后停止。我应该怎样解
假设我有 ConcurrentLinkedQueue 类型的类字段。此类的一些方法向该队列提供新元素。还有一些其他方法需要轮询此时队列中的所有元素。 我无法在循环中使用poll(),因为在循环尚未完成
作为我项目的一部分,我需要创建一个包含固定数量线程的线程池。每当线程分配给不同的进程时,我也需要与线程一起分配那么多 session 。我想使用 ConcurrentLinkedQueue (固定大小
我正在开发一个项目,其中我将某些数据包添加到队列中以便稍后处理(接下来的 600 毫秒滴答处理队列中的所有数据包)。 但是,我目前遇到了麻烦,因为当在同一周期中接收到两个数据包时,队列的行为非常奇怪。
我正在开发一个 Andoid 应用程序,它由在后台运行的服务和连接到该服务的一些 Activity 组成。该服务在它自己的进程上运行。 我的Service主要有3个类:ServiceMain、Serv
您能否澄清一下,我们是否需要使用显式同步或锁来使用 ConcurrentLinkedQueue?我特别想知道以下 ConcurrentLinkedQueue 方法是否需要同步调用。 添加 清除 尺寸
当前正在 for 循环中处理的元素是队列的头部吗? private Queue users = new ConcurrentLinkedQueue(); for(User u : users){
我想知道在什么情况下 ConcurrentLinkedQueue 无法从其集合中删除元素。该项目存在,它在集合内但调用 SomeConcurrentLinkedQueue.remove(item) 不
我想实现一个监视器队列,两个不相关的线程可以共享它的附加内容。在这种情况下,仅使用 ConcurrentLinkedQueue 就足够了,还是我应该采取不同的做法?我想实现 Activity 对象设计
我想使用 ConcurrentLinkedQueue在原子中lock-free方式: 多个并发线程将事件插入队列,其他线程将处理它们。队列未绑定(bind),我不希望任何线程等待或被锁定。然而,阅读部
阅读 Java's ConcurrentLinkedQueue Docs ,我想知道为什么实现无法存储大小: Beware that, unlike in most collections, the
我想使用 java.util.ConcurrentLinkedQueue 作为 Servlet 的非持久队列。这是该类(class)的 javadoc 中的简介。 An unbounded threa
如何在 Java 中使用 ConcurrentLinkedQueue? 使用这个LinkedQueue,我需要担心队列中的并发吗?还是我只需要定义两个方法(一个从列表中检索元素,另一个将元素添加到列表
当我们使用诸如 ConcurrentLinkedQueue 甚至一些 BlockingQueue 之类的内置队列之一时,单个调用是原子的并且保证是线程安全的。 但是当对 API 的 5 次调用中,有
我有一个工作线程,它应该迭代 ArrayList 。其他线程可以添加和删除对象(队列)。但ArrayList不是线程安全的。使用 ConcurrentLinkedQueue 可以吗?而不是ArrayL
我有以下代码: Queue localMsgQueue; //inside the constructor localMsgQueue = new ConcurrentLinkedQueue(); p
我广泛使用 ConcurrentLinkedQueue 进行多消耗任务排队,以前从未遇到过此问题。场景如下: 用一些任务填充我的队列 运行多个线程(在本例中为 2 个),这些线程将从队列中池化任务 当
我的线程永远运行并在 ConcurrentLinkedQueue#peek() 之后调用 ConcurrentLinkedQueue#poll()。 但在某些情况下,线程似乎挂起。我知道这有点含糊但是
我目前正在开发一个 Java 项目,该项目在原始数据包通过网络时对其进行处理。数据由libpcap读入,然后每个数据包放入一个byte[],然后放入一个ConcurrentLinkedQueue,线程
使用ConcurrentLinkedQueue时出现以下错误: Error : local variables referenced from a lambda expression must be
我是一名优秀的程序员,十分优秀!