peek

java高并发系列

情到浓时终转凉″ 提交于 2020-04-22 03:47:12
这是java高并发系列第25篇文章。 环境:jdk1.8。 本文内容 掌握Queue、BlockingQueue接口中常用的方法 介绍6中阻塞队列,及相关场景示例 重点掌握4种常用的阻塞队列 Queue接口 队列是一种先进先出(FIFO)的数据结构,java中用 Queue 接口来表示队列。 Queue 接口中定义了6个方法: public interface Queue<E> extends Collection<E> { boolean add(e); boolean offer(E e); E remove(); E poll(); E element(); E peek(); } 每个 Queue 方法都有两种形式: (1)如果操作失败则抛出异常, (2)如果操作失败,则返回特殊值( null 或 false ,具体取决于操作),接口的常规结构如下表所示。 操作类型 抛出异常 返回特殊值 插入 add(e) offer(e) 移除 remove() poll() 检查 element() peek() Queue 从 Collection 继承的 add 方法插入一个元素,除非它违反了队列的容量限制,在这种情况下它会抛出 IllegalStateException ; offer 方法与 add 不同之处仅在于它通过返回 false 来表示插入元素失败。 remove 和

瑞德西韦被曝疗效显著:新冠重症患者死亡率低于2%,绝大多数一周内出院

拜拜、爱过 提交于 2020-04-19 21:15:53
  初步数据显示,“人民的希望”在美国的一项临床试验中效果显著。   美国医疗媒体 STAT 报道称, 被寄予厚望的瑞德西韦在芝加哥大学医学院进行的一项临床试验显示良好效果,125 名患者在接受瑞德西韦药物治疗之后,绝大多数重症患者的发烧、呼吸道症状迅速消退,在一周内就出院,2 名患者死亡,初步结果显示治疗效果明显。   自美国首例新冠病毒感染者通过同情用药使用瑞德西韦出现疗效后,瑞德西韦成为潜在抗新冠有效药中最受关注的药物之一,早些时候,芝加哥大学医学院招募了125 名新冠肺炎患者进入吉利德的两项三期临床试验,其中有 113 名为重症患者。所有患者均接受了瑞德西韦输液治疗。    需要注意的是,这则报道不是芝加哥大学医学院或吉利德正式发布的试验结果,该公司称4月将公布针对重症患者的临床试验结果。   对于消息来源,STAT 称获得了一份视频,内容为芝加哥大学传染病医学专家、该试验的研究员 Kathleen Mullane在为校内的其他研究者做介绍,他说,“大多数病人已经出院,只有 2 个病人死亡。”   STAT 后来联系到 Kathleen Mullane 本人,后者确认了视频内容的真实性。   Kathleen Mullane 还在视频中表示,尽管数据结果很好,但还是无法得出更多结论。 其中的重要原因就是这些试验没有设置安慰剂组进行对照。 不过试验过程中

JAVA concurrency -- 阻塞队列ArrayBlockingQueue源码详解

天大地大妈咪最大 提交于 2020-04-18 14:52:22
JAVA concurrency -- 阻塞队列ArrayBlockingQueue源码详解 概述 ArrayBlockingQueue顾名思义,使用数组实现的阻塞队列。今天我们就来详细讲述下他的代码实现 阻塞队列 什么是阻塞队列? 阻塞队列是一种特殊的队列,使用场景为并发环境下。在某种情况下(当线程无法获取锁的时候)线程会被挂起并且在队列中等待,如果条件具备(锁被释放)那么就会唤醒挂起的线程。 通俗点来讲的话,阻塞队列类似于理发店的等待区,当没有理发师空闲的时候,客人会在等待区等待,一旦有了空闲,就会有人自动递补。 类的继承关系 ArrayBlockingQueue继承了抽象队列,并且实现了阻塞队列,因此它具备队列的所有基本特性。 基本实现原理 ArrayBlockingQueue的实现是基于ReentrantLock以及AQS内部实现的锁机制以及Condition机制。 ArrayBlockingQueue内部声明了两个Condition变量,一个叫notEmpty,一个叫notFull,当有数据加入队列时尝试唤醒notEmpty,当有数据移除队列时则唤醒notFull,从而实现一个类似于生产者消费者模型的机制。 源码分析 类成员变量 // 队列的存储对象数组 final Object[] items; // 下一个取出的序号 int takeIndex; //

Queue

て烟熏妆下的殇ゞ 提交于 2020-04-18 14:45:53
定义 队列是一种特殊的线性表,先进先出,它只允许在表的前端进行删除,在表的后端进行插入。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。 简单一个小 Demo public static Queue<String> queueDemo(){ Queue<String> queue = new LinkedList<String>(); //添加元素 queue.offer("f"); queue.offer("r"); queue.offer("o"); queue.offer("z"); queue.offer("e"); queue.offer("n"); //add()和remove()方法在失败的时候会抛出异常(不推荐) queue.add("redant"); queue.remove("b"); for(String q : queue){ System.out.println("逐个遍历Queue中的元素:"+q); } System.out.println("删除队列中的第一个元素,poll:"+queue.poll()); System.out.println("队列中的第一个元素,element:"+queue.element()); System.out.println("队列中的第一个元素,peek:"

自己动手实现java数据结构(三) 栈

一曲冷凌霜 提交于 2020-04-18 07:55:15
1.栈的介绍   在许多算法设计中都需要一种 "先进后出(First Input Last Output)" 的数据结构,因而一种被称为 "栈" 的数据结构被抽象了出来。   栈的结构类似一个罐头:只有一个开口;先被放进去的东西沉在底下,后放进去的东西被放在顶部;想拿东西必须按照从上到下的顺序进行操作。    示意图来自《大话数据结构》   对于一个类似罐头的栈,用户能对其进行的操作很少:仅仅可以对栈顶开口处元素进行操作,因而栈的使用方式非常简单。 2.栈的ADT接口 /** * 栈ADT 接口定义 * */ public interface Stack<E> { /** * 将一个元素 加入栈顶 * @param e 需要插入的元素 * @return 是否插入成功 * */ boolean push(E e); /** * 返回栈顶元素,并且将其从栈中移除(弹出) * @return 当前栈顶元素 * */ E pop(); /** * 返回栈顶元素,不将其从栈中移除(窥视) * @return 当前栈顶元素 * */ E peek(); /** * @return 返回当前栈中元素的个数 */ int size(); /** * 判断当前栈是否为空 * @return 如果当前栈中元素个数为0,返回true;否则,返回false */ boolean isEmpty(); /

Java底层类和源码分析系列-ArrayBlockingQueue底层架构和源码分析

…衆ロ難τιáo~ 提交于 2020-04-17 01:05:21
【推荐阅读】微服务还能火多久?>>> ArrayBlockingQueue是一个基于数组实现的有界的阻塞队列。 几个要点 ArrayBlockingQueue是一个用数组实现的队列,所以在效率上比链表结构的LinkedBlockingQueue要快一些,但是队列长度固定,不能扩展,入列和出列使用同一把锁。LinkedBlockingQueue是入列出列两把锁,读写分离。 先进先出,FIFO,队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素 新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素 利用重入锁来保证并发安全 初始化时必须传入容量,也就是数组的大小,不需要扩容,因为是初始化时指定容量,并循环利用数组,使用之前一定要慎重考虑好容量 put(e)(put(e)时如果队列满了则使用notFull阻塞等待)、take()阻塞 add(e)时如果队列满了则抛出异常 remove()时如果队列为空则抛出异常 offer(e)时如果队列满了则返回false poll()时如果队列为空则返回null poll(timeout, unit)时如果队列为空则阻塞等待一段时间后如果还为空就返回null 只使用了一个锁来控制入队出队,效率较低 定义 public class ArrayBlockingQueue<E> extends

vscode常用快捷键

╄→尐↘猪︶ㄣ 提交于 2020-04-13 22:20:30
【今日推荐】:为什么一到面试就懵逼!>>> 一、vscode常用快捷键 1.新建文件:chtr+n 2.新开窗口:ctrl+shift+n 3.分屏:ctrl+1/2/3 4.切换文件:alt+1/2/3或ctrl+tab 5.关闭当前窗口:ctrl+w 6.关闭所有已保存窗口:ctrl+k+w 7.显示/隐藏左侧边栏:ctrl+b 8.文件重命名:鼠标选中+f2 9.自动换行:alt+z(标签过长需要拖动编辑器下方滚动条阅读时不太方便,可以一键换行) 10.注释:ctrl+/ 11.多行编辑:alt+鼠标左键 12.隐藏/显示终端:ctrl+~ 13.查找并打开文件:ctrl+p 14.选中当前单词:ctrl+d 如果想选中所有此单词,ctrl+shift+L 15.文件内容查找替换:ctrl+f ctrl+h ,替换一个ctrl+shift+1,替换所有ctrl+alt+enter 16.项目全局搜索:ctrl+shift+f 17.移动当前行,向上alt+up(方向键↑) 向下alt+down 18.在当前行上方插入一行:ctrl+shift+enter 20.跳转到文件头部/尾部:ctrl+home/end 21.选中光标到行首/行尾文本:shift+home/end 22.选中部分文字:shift+left/right/up/down 23.删除当前行:ctrl+x 24

JS数据结构与算法——栈

倾然丶 夕夏残阳落幕 提交于 2020-04-13 16:02:07
【今日推荐】:为什么一到面试就懵逼!>>> JS数据结构与算法——栈 1、栈结构概念 栈(Stack)是一种 先进后出 (LIFO Last in First out)的线性表,先进栈的将会比后进栈的先出栈。 栈的限制是仅允许在一端进行插入和删除运算。这一端被称为栈顶,相对地将另一端称为栈底; 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素; 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素; 2、栈操作 栈的常见操作包含以下几种: push(element) : 入栈,将一个元素加入栈顶 pop() : 出栈,将栈顶元素从栈中弹出,同时返回弹出元素 peek() : 返回栈顶元素,不会对其进行其他操作 isEmpty() : 查看栈是否为空 size() : 返回栈内元素个数 clean() : 清空栈内元素 toString() : 返回字符串 3、栈封装示例 function Stack() { this.items = []; //压栈 /*this.push = function(){} 该方法也可用,相对于实例的属性*/ //相对于对象的属性,性能更优 Stack.prototype.push = function (element) { this.items.push(element

Perl线程队列:Thread::Queue

天涯浪子 提交于 2020-04-13 15:55:29
【今日推荐】:为什么一到面试就懵逼!>>> (Thread::Queue)队列数据结构(FIFO)是线程安全的 ,它保证了某些线程从一端写入数据,另一些线程从另一端读取数据。只要队列已经满了,写入操作就自动被阻塞直到有空间支持写操作,只要队列空了,读取操作就会自动阻塞直到队列中有数据可读。这种模式自身就保证了线程安全性。 创建队列 new() new(LIST) new()可以创建一个空队列,或者根据已有的列表创建队列,列表中的元素会按照先后顺序放进这个队列中。 哪些元素可放进队列 可以被 threads::shared 共享的数据都可以放进队列。包括: Ordinary scalars Array refs Hash refs Scalar refs Objects based on the above 放进队列的数据必须是已经共享的,如果没有共享,则会自动克隆(递归克隆)一份后将其共享并将共享后放进队列。 例如,下面首先会创建一个空队列,由于 @arr 未共享,所以会先通过 &shared([]) 将一个空列表(匿名列表引用)共享,并将 @arr 中的3个元素放进去,然后再将这个共享的匿名列表放进队列。 my @arr = qw(foo bar baz); $q->enqueue(\@arr); 但是下面的数据是已经共享的,将会直接放进队列中,而不需要先克隆一份。 my

C#队列学习笔记:MSMQ入门一

爱⌒轻易说出口 提交于 2020-04-12 09:03:11
原文: C#队列学习笔记:MSMQ入门一 一、引言 MSMQ 全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中,本地或者异地的消息接收程序再从该队列中取出发给它的消息进行处理。 消息Message 是由通信的双方所需要传递的信息。消息是MSMQ的存储对象,封装为System.Messaging.Message对象,它由一个主体(body)和若干属性构成,其中我们的用户数据通常被序列化装入body主体中,这也是我们称它为数据容器的原因。除了body属性,还有几个属性相对来说比较重要:Priority(消息的优先级),Label(用户定义的消息标识),Formatter(消息的序列组件,当用户将复杂类型数据填充到body中,用户的数据会先被序列化)。 队列 分事务性队列和非事务性队列,默认创建的是非事务性队列。当我们勾选事务性复选框,就会创建事务性队列。那么什么是事务性队列呢?事务性队列将消息保存在磁盘上,实现了持久化,也就是说当关机断电后,下次再启动机器