当前位置: 首页 > 知识库问答 >
问题:

阻塞队列是否破坏了多线程的目的

贺兴昌
2023-03-14

如果队列已满,ArrayBlockingQueue将阻止生产者线程;如果队列为空,ArrayBlockingQueue将阻止消费者线程。

这种阻塞的概念是否与多线程的思想背道而驰?如果我有一个“主”线程,并假设我想将所有“日志记录”活动委托给另一个线程。因此,基本上在我的主线程内,我创建了一个Runnable来记录输出,并将其放在ArrayBlockingQueue上。这样做的全部目的是让“主”线程立即返回,而不会在昂贵的日志记录操作中浪费任何时间。

但如果队列已满,主线程将被阻塞,并将等待一个可用的位置。那么它对我们有什么帮助呢?

共有3个答案

阎俊英
2023-03-14

在您的示例中,我认为阻塞是一项功能:它可以防止OutOfMemoryError。

一般来说,您的一个线程速度不够快,无法处理指定的负载。因此,其他程序必须以某种方式放慢速度,以免危及整个应用程序。

另一方面,如果负载是平衡的,队列就不会阻塞。

禄光霁
2023-03-14

我想这是设计师的决定。如果他选择了阻塞模式,ArrayBlockingQueue将为其提供put方法。如果设计者不希望阻塞模式ArrayBlockingQueue具有提供方法,该方法将在队列已满时返回false,但他需要决定如何处理已注册的日志事件。

束涵涤
2023-03-14

队列并不是出于恶意而阻塞的,它阻塞是为了给系统引入额外的质量。在这种情况下,这是防止饥饿。

想象一组线程,其中一个线程可以快速生成工作单元。如果允许队列无限增长,“快速生产者”队列可能占据所有生产能力。有时,预防此类副作用比解除所有线程的阻塞更重要。

 类似资料:
  • 我编写了一个简单的类,我计划将其扩展为客户端套接字编程应用程序的一部分。类涉及一个BlockingQueue(我从这里复制了代码:相当于Java的BlockingQueue的C++)。当我创建了下面的包装类的一个实例后,我打算让它生成一个单独的线程,该线程只需执行BlockingQueue上阻塞的printer()函数,直到有一个或多个字符串可用,然后它只需将字符串打印到控制台窗口。在我的预期应用

  • 1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列提供了四种处理方法 方法\处

  • 问题内容: 目的:- 使用Java中的Blocking IO来构建多线程应用程序以下载文件。 请不要建议我使用Non-Blocking IO ,有人告诉我要使用此。 问题:- 我的代码在客户端计算机上工作正常,该客户端计算机下载服务器上托管的文件。但是,问题是我的服务器使用多个线程来播种该文件。在所有情况下,收到的文件都是确切的长度,但是文件似乎已损坏。就像,当我下载一个PDF文件时,文件页面被写

  • 我正在编写一个有3个线程的程序。一个读取一个文本文件并将单词输入到大小为2的ArraylistBlockingQueue中。下一个获取该列表并反转其中的每个其他单词。最后一个线程获取单词并将它们写入一个新的文本文件。 我所有的东西都在工作,除了我不知道如何中断和停止我的线程。程序写入文本文件,但从未结束。 主要方法 输入 反向类@重写公共void run(){ 输出代码@覆盖公共无效run(){

  • 我有4-5个工作线程处理大型消息队列。我还有另一段代码,它使用2-3个worker运行。我想在处理大型消息队列时阻止所有其他工作者。 我正在使用JDK6和Jms 编辑: 队列进程工作者从未终止。当没有消息时,它们阻塞队列。这些工作者由执行器线程池管理,如果我使用读写锁,其中一个工作者也会被阻塞。此外,如果使用循环屏障,那么我必须终止线程,以便重新传递阻塞的第二个进程。由于工作者是由线程池管理的,所

  • 我正在使用(java)LinkedBlockingQueue创建资源池,其中 资源元素是等价的,属于一个池,它们的排序是无关紧要的。 消费者是竞争线程,一次抓取一个资源,使用“拉”操作,处理资源,然后通过“添加”操作将其返回给池。 当特定资源被消费者线程使用时,它不得对其他消费者线程可用。 问题是:LinkedBlockingQueue不会对等待的消费者进行FIFO,而且服务水平也不统一。 关于这