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

java并发队列

如第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并发队列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BBScan:信息泄漏批量扫描脚本

有些朋友手上有几十万甚至上百万个域名&#xff0c;如果把这些域名全部扔给wvs、 APPscan这样的重型扫描器&#xff0c;显然是不太合适的。 对于一个拥有上万IP的企业&#xff0c;又如何快速定位可能存在弱点的机器呢&#xff1f; 试试信息泄漏批量扫描脚本 BBScan。 BBScan是一…

【APICloud系列|18】上架Android应用到腾讯应用包、百度手机助手、华为应用市场、小米应用商店、阿里应用分发平台需要准备哪些材料?

前端时间用敏捷式开发平台开发了一款APP应用,应用名称我就不说啦,这篇文章主要讲述一下上架各大安卓应用商店(腾讯应用宝、阿里应用商店、百度手机助手、华为应用市场、小米应用商店)需要准备哪些材料,有相关的困扰欢迎私信我。 一、应用商店选择 推荐平台(六选五) 1.…

Activiti 6中的可插拔持久性

在过去的几年中&#xff0c;我们经常听到&#xff08;来自社区和我们的客户&#xff09;关于如何将Activiti的持久性逻辑从关系数据库交换到其他内容的请求。 当我们宣布Activiti 6时&#xff0c; 我们做出的承诺之一就是我们将实现这一目标。 深入研究Activiti引擎代码的人会…

src漏洞类型总结

本文转载于https://blog.csdn.net/qq_33942040/article/details/111831536 这三类存在漏洞可能更大 越他娘丑的站&#xff0c;越有可能存在洞。 Asp aspx 存在漏洞的可能更大 登陆口没得验证码的可能存在一,未授权访问 常见28种服务器或者中间协议未授权访问 易出现处 ①照片…

[LeetCode][JavaScript]Roman to Integer

Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. https://leetcode.com/problems/roman-to-integer/ 罗马数字转阿拉伯数字。 从后往前扫&#xff0c;如果当前的数大于之前的数&#xff0c;加…

【APICloud系列|19】上架APPStore需要准备哪些材料?

前端时间用敏捷式开发平台开发了一款APP应用,应用名称我就不说啦,这篇文章主要讲述一下上架苹果应用商店APPStore需要准备哪些材料,有相关的困扰欢迎私信我。 一、上架流程 1. 注册苹果企业账号 2. 创建测试证书,发布证书 (使用Mac) 3. 使用xcode 上传应用到APP Store (…

Json注入

一、Json简介 JSON 是存储和交换文本信息的语法&#xff0c;是轻量级的文本数据交换格式。类似xml&#xff0c;但JSON 比 XML 更小、更快&#xff0c;更易解析。所以现在接口数据传输都采用json方式进行。JSON 文本的 MIME 类型是 “application/json”。 json语法 数据在名…

国行 lg g3 D858 刷 lg g3 D858hk 教程(备忘)

纯手打&#xff0c;转载请注明出处~ 刷机有风险&#xff0c;出现问题概不负责&#xff01; 本着自娱自乐的宗旨 &#xff0c;分享一下&#xff0c;出了问题不负责&#xff01; 准备的材料&#xff1a; 1&#xff0c;手机一枚&#xff08;废话&#xff09;国行lg g3 d858 2&am…

七夕(情人节)表白女朋友,程序员应该如何装一波13

很多小伙伴私信说程序员应该怎么表白女朋友,大神支个招,直接上代码。最近的.vbs或者.vbe表白真的很火,小伙伴们赶紧动起来。(废话少说,赶紧往下看) 代码一: msgbox("做我女粉丝好吗?")msgbox("房产证上写你名字")msgbox("孙叫兽")msgb…

渗透测试-验证码的爆破与绕过

【验证码机制原理】 客户端发起请求->服务端响应并创建一个新的SessionID同时生成随机验证码&#xff0c;将验证码和SessionID一并返回给客户端->客户端提交验证码连同SessionID给服务端->服务端验证验证码同时销毁当前会话&#xff0c;返回给客户端结果。 【客户端可…

java并发调用_Java并发教程–可调用,将来

java并发调用从Java的第一个发行版开始&#xff0c;Java的美丽之处之一就是我们可以轻松编写多线程程序并将异步处理引入我们的设计中。 Thread类和Runnable接口与Java的内存管理模型结合在一起&#xff0c;意味着可以直接进行线程编程。 但是&#xff0c;如第3部分所述&#x…

最近对项目代码做的一些更改和感想

最近对项目代码做了一些更改&#xff0c;主要的改动是对整个界面框架的改变&#xff0c;因为以前写代码的时候&#xff0c;为了完成功能&#xff0c;没有从上帝视角来思考软件的界面设计&#xff0c;完全是需要这个功能了&#xff0c;怎么可以做到&#xff1f;好&#xff0c;就…

CSS常见的四种垂直居中的方法

面试中不管是笔试题还是面试题,一般很容易被问到如何实现垂直水平居中,这里总结四种方法作为参考 (1)margin:auto法 css: div{ width: 400px; height: 400px; position: relative; border: 1px solid #465468; } img{ position: absolute; margin: auto; top: 0; left: 0; …

Linux下切换Python2和Python3的4种方法

本篇博文面向Linux用户&#xff0c;在Linux下(Ubuntu)下测试通过&#xff0c;Win用户嘛&#xff0c;…… 0x00 为什么需要有两个版本的Python Python2和Python3不兼容是每个接触过Python的开发者都知道的事&#xff0c;虽说Python3是未来&#xff0c;但是仍然有很多项目采用P…

异步EJB只是一个Gi头吗?

在之前的文章&#xff08; 此处和此处 &#xff09;中&#xff0c;我展示了当服务器负载沉重时&#xff0c;创建非阻塞异步应用程序可以提高性能。 EJB 3.1引入了Asynchronous批注&#xff0c;用于指定方法将在将来的某个时间返回其结果。 Javadocs声明必须返回void或Future 。…

常见的清除浮动的五种解决办法

方法一:使用带clear属性的空元素 在浮动元素后使用一个空元素如 <div class="clear"></div> 并在CSS中赋予 .clear{clear:both;} 属性即可清理浮动。亦可使用 <br class="clear" /> 或 <hr class="clear" /> …

Kali环境下安装python3

Kali环境下安装python3 参考&#xff1a; 由于kali环境下是自动安装了python 2.7&#xff0c;没有python3以上的版本&#xff0c;现在开始安装python 1. 先下载python3的tar包 进入这个目录&#xff1a; cd /usr/local/ 创建一个新文件夹python3&#xff1a; mkdir /usr/loc…

用汇编语言写的第一个DOS程序

今天整理电脑时&#xff0c;看到两三年前学习汇编语言时写的显示“Hello”的程序。不禁感叹那个时候学得如此用心&#xff0c;同样的功能&#xff0c;我竟然用了四种写法。现贴出源码&#xff0c;为了以后继续学习&#xff0c;也为了给初学者一点启发。(删掉注释了&#xff0c;…

对安卓应用进行加固签名,为上架各大应用市场做准备

上架安卓各大应用市场之前需要对自己的应用进行签名加固&#xff0c;签名是为了证明你是这个应用的开发者&#xff0c;软著也是一种方式&#xff0c;这是不做介绍&#xff0c;加固是为了从安全角度给安装包加一个保护层&#xff0c;防止被恶意破解及攻击。下面简单介绍一下签名…

ADO.Net 事务操作

DbTransaction转载于:https://www.cnblogs.com/lxf1117/p/4773742.html