如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱。

在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列。

队列

首先,简要回顾一下什么是标准队列。 在计算机科学中,队列只是一个集合,始终将元素添加到末尾,并始终从头开始获取元素。 表达式先进先出(FIFO)通常用于描述标准队列。 在Java 1.6中引入的是Deque或双端队列,该接口现在在LinkedList上实现。 Java中的某些队列允许其他排序,例如使用Comparator甚至编写自己的排序实现。 虽然扩展功能很好,但是我们今天关注的是BlockingQueues如何真正在并发开发中大放异彩。

阻塞队列

阻塞队列是一些队列,它们还公开了在没有可用元素的情况下阻止检索元素的请求的功能,该附加选项可以限制等待时间。 在受限制的大小队列上,尝试添加时可以使用相同的阻止功能。 让我们深入探讨一下BlockingQueue用法的示例。

让我们假设一个简单的场景。 您有一个处理线程,其功能只是执行命令。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;private BlockingQueue<Command> workQueue = new LinkedBlockingQueue<Command>();public void addCommand(Command command) {workQueue.offer(command);
}public Object call() throws Exception {try {Command command = workQueue.take();command.execute();} catch (InterruptedException e) {throw new WorkException(e);}
}

当然,这是一个非常简单的示例,但它向您展示了对多个线程使用BlockingQueue的基本知识。 让我们尝试一些更多的事情。 在此示例中,我们需要创建一个具有限制的连接池。 它仅应根据需要创建连接。 没有客户端将等待超过5秒的可用连接。

private BlockingQueue<Connection> pool = new ArrayBlockingQueue<Connection>(10);
private AtomicInteger connCount = new AtomicInteger();public Connection getConnection() {Connection conn = pool.poll(5, TimeUnit.SECONDS);if (conn == null) {synchronized (connCount) {if (connCount.get() < 10) {conn = getNewConnection();pool.offer(conn);connCount.incrementAndGet();}}if (conn == null) {throw new ConnUnavailException();} else {return conn;}}
}

最后,让我们考虑一个有趣的实现示例示例SynchronousQueue

在此示例中,类似于我们的第一个示例,我们想要执行一个Command,但是需要知道它何时完成,最多等待2分钟。

private BlockingQueue workQueue = new LinkedBlockingQueue();
private Map commandQueueMap = new ConcurrentHashMap(); public SynchronousQueue addCommand(Command command) {SynchronousQueue queue = new SynchronousQueue();commandQueueMap.put(command, queue);workQueue.offer(command);return queue;
}public Object call() throws Exception {try {Command command = workQueue.take();Result result = command.execute();SynchronousQueue queue = commandQueueMap.get(command);queue.offer(result);return null;} catch (InterruptedException e) {throw new WorkException(e);}
}

现在,使用者可以安全地轮询其请求以执行其命令的超时。

Command command;
SynchronousQueue queue = commandRunner.addCommand(command);
Result result = queue.poll(2, TimeUnit.MINUTES);
if (result == null) {throw new CommandTooLongException(command);
} else {return result;
}

正如您开始看到的那样,java中的BlockingQueues提供了很大的灵活性,并为您提供了相对简单的结构来满足多线程应用程序中的许多(如果不是全部)需求。 我们甚至没有审查过一些非常整洁的BlockingQueues ,例如PriorityBlockingQueueDelayQueue 。 看看他们并取得联系。 我们喜欢与开发人员交谈。

参考: Carfey Software博客上的JCG合作伙伴的Java并发第5部分-阻塞队列 。

相关文章 :
  • Java并发教程–信号量
  • Java并发教程–重入锁
  • Java并发教程–线程池
  • Java并发教程–可调用,将来
  • Java并发教程– CountDownLatch
  • Exchanger和无GC的Java
  • Java Fork / Join进行并行编程
  • 使用迭代器时如何避免ConcurrentModificationException
  • 改善Java应用程序性能的快速技巧

翻译自: https://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-blocking.html

Java并发教程–阻塞队列相关推荐

  1. java并发队列_Java并发教程–阻塞队列

    java并发队列 如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列 ...

  2. 让人抓头的Java并发(四) 阻塞队列--CPU飙升排查案例

    在上一篇文章中给大家介绍了牛批的AQS,大致讲解了JUC中同步的思路.本来还没想好这一篇应该写点什么,刚好上周某个同事的代码出现问题,排查后发现是使用阻塞队列不当导致的,所以本篇决定介绍下阻塞队列. ...

  3. Java并发教程– CountDownLatch

    Java中的某些并发实用程序自然会比其他并发实用程序受到更多关注,因为它们可以解决通用问题而不是更具体的问题. 我们大多数人经常遇到执行程序服务和并发集合之类的事情. 其他实用程序不太常见,因此有时它 ...

  4. Java并发教程–可调用,将来

    从Java的第一个发行版开始,Java的美丽之处之一就是我们可以轻松编写多线程程序并将异步处理引入我们的设计中. Thread类和Runnable接口与Java的内存管理模型结合使用,意味着可以进行简 ...

  5. Java并发教程–重入锁

    Java的synced关键字是一个很棒的工具–它使我们能够以一种简单可靠的方式来同步对关键部分的访问,而且也不难理解. 但是有时我们需要对同步进行更多控制. 我们要么需要分别控制访问类型(读取和写入) ...

  6. Java并发教程–信号量

    这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入探讨Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章将介绍信号量-特别是对信号 ...

  7. Java并发教程–线程池

    Java 1.5中提供的最通用的并发增强功能之一是引入了可自定义的线程池. 这些线程池使您可以对诸如线程数,线程重用,调度和线程构造之类的东西进行大量控制. 让我们回顾一下. 首先,线程池. 让我们直 ...

  8. 聊聊并发(七)——Java中的阻塞队列

    1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用 ...

  9. 转:Java 7 种阻塞队列详解

    转自: Java 7 种阻塞队列详解 - 云+社区 - 腾讯云队列(Queue)是一种经常使用的集合.Queue 实际上是实现了一个先进先出(FIFO:First In First Out)的有序表. ...

最新文章

  1. HTTPS 证书配置
  2. Linux数据报文接收发送总结2
  3. 21.C 语言与 C++在内存分配有什么区别?
  4. 本地---tcpserver与tcpclient
  5. 这是我见过最全面的Python装饰器详解 没有学不会这种说法
  6. 大华的支持rtmp推流吗_海康大华DSS视频拉流-RTSP转RTMP多媒体播放技术
  7. Ehcache 3.7文档—基础篇—XML Configuration
  8. 基于C++实现的贪吃蛇游戏设计
  9. 水泵smart200编程_第453期丨PLC梯形图编程很low?星三角启动,转换角型时电机反转是真的吗?...
  10. 微软sql服务器可以卸载,完美卸载SQL Server 2008的方法
  11. axure 折线图部件_在Axure中怎么做柱状图、折线图啊?
  12. Rk 平台显示屏调试
  13. 海底捞:服务喧宾夺主,盈利不见起色
  14. [攻防世界]getit
  15. html 字母全部大写,HTML文本框录入字母自动大写问题解决方法
  16. 新媒体运营教程:活动运营策划推广思路
  17. 内核参数强制显示器显示
  18. 5g时代php发展趋势,5g时代还有多久到来
  19. hadoop可以解决什么问题_CC光嫩肤 可以解决什么皮肤问题?
  20. hiwifi(gee极路由)路由器配置:

热门文章

  1. apache lucene_Apache Lucene中的并发查询执行
  2. activiti dmn_新的DMN编辑器预览
  3. 穹顶灯打不出阴暗面_Java生产监控的阴暗面
  4. eclipse中ast_JavaParser中AST节点的观察者
  5. 7-8垃圾箱分布_您认为有关垃圾收集的7件事-完全错了
  6. servlets_jQuery Ajax – Servlets集成:构建完整的应用程序
  7. central maven_一键发布到Maven Central的方法
  8. 掌握Java 11的Constantdynamic
  9. 使用AWS Lambda的CloudWatch事件通知
  10. karaf osgi_在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合