当前位置: 首页 > 面试题库 >

我应该在Java中使用哪个并发队列实现?

蒋栋
2023-03-14
问题内容

从JavaDocs:

  • 一的ConcurrentLinkedQueue是当许多线程共享访问一个共同的集合一个合适的选择。此队列不允许空元素。
  • ArrayBlockingQueue是一个经典的“有界缓冲区”,其中固定大小的数组保存由生产者插入并由消费者提取的元素。此类支持可选的公平性策略,用于订购正在等待的生产者和使用者线程
  • 与基于阵列的队列相比,LinkedBlockingQueue通常具有更高的吞吐量,但是在大多数并发应用程序中,可预测的性能较差。

我有两种情况,一种情况要求队列支持一个使用者使用许多生产者(使用它的线程),而另一种情况则相反。

我不知道要使用哪种实现。有人可以解释这些区别是什么吗?

另外,什么是“可选的公平政策” ArrayBlockingQueue


问题答案:

基本上,它们之间的区别是性能特征和阻塞行为。

最简单的首先ArrayBlockingQueue是固定大小的队列。因此,如果将大小设置为10,并尝试插入第11个元素,则insert语句将阻塞,直到另一个线程删除该元素。公平问题是,如果多个线程试图同时插入和删除(换句话说,在阻塞队列期间),将会发生什么。公平算法确保发出请求的第一个线程是获得的第一个线程。否则,给定线程的等待时间可能会比其他线程更长,从而导致无法预料的行为(有时一个线程将只需要几秒钟,因为稍后启动的其他线程会先被处理)。折衷方案是管理公平性需要开销,从而减慢了吞吐量。

LinkedBlockingQueue和之间最重要的区别ConcurrentLinkedQueue是,如果您从中请求一个元素LinkedBlockingQueue并且队列为空,则线程将等待直到那里有东西。A
ConcurrentLinkedQueue将立即以空队列的行为返回。

哪一个取决于您是否需要阻止。在您有许多生产者和一个消费者的地方,听起来像是。另一方面,在您有许多使用者且只有一个生产者的情况下,您可能不需要阻塞行为,并且可能很高兴让使用者检查队列是否为空并继续前进。



 类似资料:
  • 问题内容: 在这个问题中,如何在C 11中有效地选择标准库容器?是选择C 集合时要使用的便捷流程图。 我认为对于那些不确定应该使用哪个集合的人来说,这是一个有用的资源,因此我试图找到类似的Java流程图,但未能做到。 哪些资源和“备忘单”可用来帮助人们选择使用Java进行编程时使用的正确Collection?人们如何知道应该使用哪些List,Set和Map实现? 问题答案: 由于找不到相似的流程图

  • 在这个问题中,如何在C 11中有效地选择标准库容器?是选择C集合时使用的方便流程图。 我认为对于那些不确定应该使用哪个集合的人来说,这是一个有用的资源,所以我试图找到一个类似的Java流程图,但没能做到。 有哪些资源和“备忘单”可以帮助人们在用Java编程时选择正确的集合?人们如何知道他们应该使用什么列表、集合和映射实现?

  • 问题内容: Java 8中有一整套日期类: ; ; ; ; ; 。 我已经忽略了他们的JavaDocs,并注意所有这些类都包含我需要的所有方法。因此,目前,我可以随机选择它们。但是我想为什么有6个单独的类并且每个类都专用于特定目的是有原因的。 技术信息和要求: 输入为,将转换为这些日期格式之一。 我不需要显示时区,但是当我比较两个日期时,能够正确比较纽约和巴黎的时间很重要。 精确的级别是秒,无需使

  • 问题内容: 由于我没有收到对最后一个问题的肯定回答。我将尝试自己编写一个Java FTP上传小程序。 我的问题是:“您能推荐一个Java FTP客户端库供我使用吗?” 我希望它是: 稳定 能够处理被动和主动模式 能够提供上传进度信息 如果出了问题(尤其是上传不成功时),则引发可捕获的异常 便宜/免费使用,最好是开源的 我发现这个 概述了一些库,但由于这篇文章是从2003年,也许一些新的事态发展已经

  • 我正在用一个需要JPA(classes)的项目测试Java9。当我添加<code>模块信息时。java并声明我的模块,包变得不可用。 我搜索了很多,但找不到在Java9模块项目中使用JPA所需的模块。 更新 正如艾伦建议的那样,我跑了 但还是有了这个 我得到“module-info.java:[3,18] module not found: java.persistence”。 更新2这是我的项目

  • 问题内容: 如下所示,使用Python 3的模块进行并行工作非常容易。 将项目插入和检索到队列中也非常方便。 我有一个脚本在后台运行,以监听更新。现在,理论上假设,随着这些更新的到来,我将对它们进行排队,并使用进行并发处理。 现在,单独地,所有这些组件都是独立工作的,并且很有意义,但是我如何一起使用它们呢?我不知道是否有可能实时从队列中馈送工作,除非预先确定要工作的数据? 简而言之,我要做的就是,