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

您应该在哪里使用BlockingQueue实现而不是Simple Queue实现?

娄浩荡
2023-03-14
问题内容

我想我将重新提出我的问题

您应该在哪里使用BlockingQueue实现而不是Simple Queue实现?

考虑到速度,并发性或其他属性(例如,访问最后一个元素的时间)等方面,BlockingQueue与Queue实现相比的优缺点是什么?

我已经使用了两种队列。我知道阻塞队列通常在并发应用程序中使用。我正在编写简单的ByteBuffer池,其中需要一些用于ByteBuffer对象的占位符。我需要最快的线程安全队列实现。甚至还有诸如ArrayList之类的List实现,它们对元素的访问时间是恒定的。

谁能讨论BlockingQueue vs Queue vs List实现的优缺点?

目前,我已经使用ArrayList来保存这些ByteBuffer对象。

我应使用哪种数据结构来保存这些对象?


问题答案:

BlockingQueue如果您想限制某种请求,则容量有限也很有帮助。有了无限的队列,生产者可以远远领先于消费者。最终将执行任务(除非有太多导致它们引起的任务OutOfMemoryError),但是生产者可能早就放弃了,因此浪费了精力。

在这种情况下,最好向可能的生产者发信号通知队列已满,并在出现故障时迅速放弃。例如,生产者可能是一个Web请求,用户不想等待太久,即使等待时它不会消耗很多CPU周期,它也会消耗有限的资源,例如套接字和一些内存。放弃将使已经排队的任务有更好的机会及时完成。

关于修改后的问题,我将其解释为“将对象保存在池中的好集合是什么?”

无边界LinkedBlockingQueue是许多池的不错选择。但是,根据您的池管理策略,a
ConcurrentLinkedQueue也可以工作。

在池应用程序中,阻塞的“放置”是不合适的。控制队列的最大大小是池管理器的工作,它决定何时为池创建或销毁资源。池的客户从池中借用并返回资源。添加新对象或将先前借用的对象返回到池中应该是快速的非阻塞操作。因此,有限容量队列不是池的理想选择。

另一方面,从池中检索对象时,大多数应用程序都希望等到资源可用为止。至少暂时阻止的“获取”操作比“忙碌的等待”要有效得多-
重复轮询直到资源可用。该LinkedBlockingQueue是个不错的选择在这种情况下。借款人可以无限期冻结take,也可以限制愿意冻结的时间poll

一个不太普遍的情况,即客户端根本不愿意阻塞,但是如果池为空,则可以为自己创建资源。在这种情况下,a
ConcurrentLinkedQueue是一个不错的选择。这是一个灰色区域,在该区域中尽可能多地共享资源(例如,内存)会很不错,但是速度更为重要。在最坏的情况下,这会退化为每个线程都有自己的资源实例;那么不麻烦尝试在线程之间共享就更有效了。

这两个集合都提供了良好的性能,并且在并发应用程序中易于使用。对于非并行应用程序,an
ArrayList很难被击败。即使对于动态增长的集合,a的每个元素开销也LinkedList允许ArrayList带有一些空插槽的容器在内存方面保持竞争力。



 类似资料:
  • 我正在使用Spring开发一个应用程序。我需要使用注释。我有和,这样。这里我很困惑应该在哪里保留注释。 我应该用注释接口还是实现?这两种做法有何不同?

  • 我已经将ViewPager和number of Fragment实现为子级,这里每个子级都覆盖自己的。 在我的应用程序中,导航行为是随机的,不是每次都有顺序。因为页面查看器执行缓存来加载额外的子级,这就是我的问题所在。我不确定何时应该初始化/释放子类成员。 需要你们的建议,在这种情况下使用PageViwer是否更好,或者我应该为每个组件使用传统的活动流。

  • 问题内容: 我无法在任何地方找到append()或任何其他内置函数的实现代码?我尝试通过godoc查找代码,并使用IDE的跳转到定义功能。可能是我在看错地方。谁能告诉我看实际实施的方式吗? 问题答案: 您可能会感兴趣: 代码生成位在这里https://github.com/golang/go/blob/master/src/cmd/compile/internal/gc/ssa.go 和,由前者使

  • 问题内容: JSR 275似乎处于拒绝状态。JScience似乎有一个实现,并且似乎有一个计量单位。 还有其他开源实现吗? 哪个软件包符合jsr-275且易于使用。 问题答案: 由于JSR-275已被拒绝,因此无法使用javax名称空间,并已由名称空间org.unitsofmeasurement代替。该JScience落实已经发布,最新的在写这篇文章的是4.3.1版本在2012年10月。干杯,Je

  • 问题内容: 建议在处理现实世界的货币值时,使用BigDecimal而不是Double。但是我没有令人信服的解释,只是“通常是这样做的”。 您能谈谈这个问题吗? 问题答案: 这称为精度损失,在处理非常大的数字或非常小的数字时非常明显。在许多情况下,带小数的十进制数字的二进制表示形式是近似值,而不是绝对值。要了解为什么需要阅读二进制形式的浮点数表示形式。这是链接:http : //en.wikiped

  • 问题内容: 我正在使用Spring开发应用程序。我需要使用注释。我和这样。我对应该在哪里保留注释感到困惑。 我应该用注释接口或实现吗?这两种方法有什么区别? 问题答案: 我从不将(或…)放在界面上,因为这会使界面无用。让我解释一下原因。 声明1:如果你有一个接口,那么你想将该接口用于注入点类型。 权利要求2:接口的目的是它定义可以由几种实现方式实现的协定。在另一侧,你有注射点()。(IMHO)仅具