peek

Java并发编程:阻塞队列

試著忘記壹切 提交于 2021-01-30 10:15:12
点击上方“ Java知音 ”,选择“置顶公众号” 技术文章第一时间送达! 作者:海子 http://www.cnblogs.com/dolphin0520/p/3932906.html 知音专栏 Javaweb练手项目源码下载 常用设计模式完整系列篇 100套IT类简历模板下载 Java常见面试题汇总篇 在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。 本文先讲述一下java.util

Java并发编程之阻塞队列

不问归期 提交于 2021-01-24 01:57:27
作者:海子 原文:http://www.cnblogs.com/dolphin0520/p/3932906.html 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。 本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法,接着分析了阻塞队列的实现原理,最后给出了一个实际例子和几个使用场景。   一.几种主要的阻塞队列   二.阻塞队列中的方法 VS 非阻塞队列中的方法   三.阻塞队列的实现原理   四.示例和使用场景 若有不正之处请多多谅解,并欢迎批评指正。 一.几种主要的阻塞队列 自从Java 1.5之后,在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个: ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。并且可以指定公平性与非公平性

解读 java 并发队列 BlockingQueue

左心房为你撑大大i 提交于 2021-01-22 03:52:09
点击上方蓝色字 "码之初" 关注,点击右上角选择"设为星标" 精品技术文章每天准时送达 让我陪你,每天都进步一点点 ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ 来源:https://javadoop.com/post/java-concurrent-queue 最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括我自己在仔仔细细看源码之前,也有许多的不解,甚至有些地方我一直都没有理解到位。 说到线程池实现,那么就不得不涉及到各种 BlockingQueue 的实现,那么我想就 BlockingQueue 的问题和大家分享分享我了解的一些知识。 本文没有像之前分析 AQS 那样一行一行源码分析了,不过还是把其中最重要和最难理解的代码说了一遍,所以不免篇幅略长。本文涉及到比较多的 Doug Lea 对 BlockingQueue 的设计思想,希望有心的读者真的可以有一些收获,我觉得自己还是写了一些干货的。 本文直接参考 Doug Lea 写的 Java doc 和注释,这也是我们在学习 java 并发包时最好的材料了。希望大家能有所思、有所悟,学习 Doug Lea 的代码风格,并将其优雅、严谨的作风应用到我们写的每一行代码中。 目录: BlockingQueue 开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现。 首先,最基本的来说,

Java高并发之BlockingQueue

最后都变了- 提交于 2021-01-22 01:17:02
简介 > 多线程中通过队列很容易共享数据,比如经典的 生产者 和 消费者 模型中,通过队列可以很方便的实现数据共享。假设我们有若干生产者线程,又有若干消费者线程,生产者线程可以通过队列将数据共享给消费者。但是生产者和消费者在某个时间段内,万一发生数据处理速度不匹配的情况呢?如果生产者生产数据的速度远大于消费者消费数据的速度,理想情况下是当生产者产生的数据到达一个阈值之后,那么生产者必须暂停一下(阻塞生产者线程),以便消费者可以把数据消费掉。在 concurrent 包出现之前,开发人员必须手动控制这些细节,导致开发高性能程序难度较大(兼顾效率和安全)。 concurrent 出来之后,带来了 BlockingQueue (在多线程中,在某些情况下挂起线程(即阻塞),一旦条件满足,被挂起的线程又会被自动唤醒) > BlockingQueue 即为阻塞队列,是一个先进先出的队列,在某些情况下,对阻塞队列的访问可能会造成阻塞,被阻塞的情况主要有两种。 当对列满时,进行入队操作时。当一个线程试图对一个已经满了的队列进行入队操作时,也将会被阻塞,除非有一个线程进行了出队列操作。 当队列空时,进行出队操作时。当一个线程试图对一个为空的队列进行出队列操作时,也将会被阻塞,费油有一个线程进行了出队列操作。 > 阻塞队列是线程安全的,主要用在生产者消费者的场景上

java中queue的使用

一个人想着一个人 提交于 2021-01-18 13:36:32
Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。 队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经满了的阻塞队列中添加一个元素或者是从一个空的阻塞队列中移除一个元索,将导致线程阻塞.在多线程进行合作时,阻塞队列是很有用的工具。工作者线程可 以定期地把中间结果存到阻塞队列中而其他工作者线线程把中间结果取出并在将来修改它们。队列会自动平衡负载。如果第一个线程集运行得比第二个慢,则第二个 线程集在等待结果时就会阻塞。如果第一个线程集运行得快,那么它将等待第二个线程集赶上来。下表显示了jdk1.5中的阻塞队列的操作: add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 element

Ubuntu 项目汇报常用的录屏、截图、Gif 软件!

两盒软妹~` 提交于 2021-01-12 01:47:43
项目汇报要录制一些视频和截图、Gif 等,于是就收集了一些好用的软件,安装方法如下,使用方法都很容易就不介绍了: 1. 录屏 SimpleScreenRecorder(建议) sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder sudo apt-get update sudo apt-get install simplescreenrecorder 2. 录屏 kazam(不能在 Win 上播放!) sudo add-apt-repository ppa:kazam-team/stable-series sudo apt-get update sudo apt-get install kazam kazam 录制的视频不能在 Win 上播放,不过 kazam 很小巧,我平常会用来录制一些视频到 B 站(@登龙 zZ)。 3. 截屏 Shutter(推荐) sudo add-apt-repository ppa:shutter/ppa sudo apt-get update sudo apt-get install shutter 4. Gif 录制 Peek(推荐) sudo add-apt-repository ppa:peek-developers/stable sudo apt-get update

LeetCode 155:最小栈 Min Stack

岁酱吖の 提交于 2021-01-10 16:55:07
LeetCode 155:最小栈 Min Stack 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) -- 将元素 x 推入栈中。 pop() -- 删除栈顶的元素。 top() -- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。 Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the minimum element in the stack. 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack

集合的学习

烂漫一生 提交于 2021-01-08 20:18:59
JAVA常用的数据结构知识,主要看集合相关。 数组和集合都是用来存储对象的,区别在于数组长度固定,集合的长度可变;数组存储基本数据类型,集合存储对象。 集合特点:只用于存储对象,长度可变,可以存储不同类型的对象。 集合框架体系 Collection接口是List、Set、Queue的父级接口。 Set接口有两个常用的实现类:HashSet和TreeSet。List接口的常用接口有ArrayList和Vector接口。 Map接口有两个常用的实现类:Hashtable和HashMap。 上述类图中,实线边框的是 实现类 ,比如ArrayList,LinkedList,HashMap等,虚线边框的是 抽象类 ,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是 接口 ,比如Collection,Iterator,List等。 1、Iterator接口   Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到

解决NGINX+PHP-FPM failed to ptrace(PEEKDATA) Input/output error出错问题

妖精的绣舞 提交于 2021-01-08 08:01:07
网站总是出现bad gateway 提示,时有,时无,查看了一下日志,居然出现一堆错误,如下 [29-Mar-2014 22:40:10] ERROR: failed to ptrace(PEEKDATA) pid 4276: Input/output error (5) [29-Mar-2014 22:53:54] ERROR: failed to ptrace(PEEKDATA) pid 4319: Input/output error (5) [29-Mar-2014 22:56:30] ERROR: failed to ptrace(PEEKDATA) pid 4342: Input/output error (5) [29-Mar-2014 22:56:34] ERROR: failed to ptrace(PEEKDATA) pid 4321: Input/output error (5) [29-Mar-2014 22:56:40] ERROR: failed to ptrace(PEEKDATA) pid 4314: Input/output error (5) 网上也找了很多方法,很多人说是rlimit_files 打开文件数的问题,但是觉得不太靠谱,最后找到鬼佬的话,看上去还有几分道理。 http://serverfault.com/questions

[从今天开始修炼数据结构]栈、斐波那契数列、逆波兰四则运算的实现

≯℡__Kan透↙ 提交于 2020-12-26 07:56:21
[从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈、斐波那契数列、逆波兰四则运算的实现 [从今天开始修炼数据结构]队列、循环队列、PriorityQueue的原理及实现 一、栈的定义   栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。栈又称后进先出的线性表,简称LIFO结构。   注意:首先它是一个线性表,也就是说栈元素有前驱后继关系。   栈的插入操作,叫做进栈,也称压栈、入栈   栈的删除操作,叫做出栈,也叫弹栈。   注意:最先入栈,不代表就要最后出栈。因为栈没有限制出栈的时间,例如可以先入栈两个元素,再出栈两个元素,后入栈其他元素。 二、栈的抽象数据类型    ADT Stack Data 同线性表。元素具有相同的类型,相邻元素具有前驱和后继。 Operation InitStack(S) : 初始化操作,建立一个空栈 DestroyStack(S):若栈存在,销毁它。 ClearStack(S):将栈清空 StackEmpty:若栈为空,返回true,否则返回false。 GetTop(S,e):若栈存在且非空,用e返回栈顶元素。 Push(S,e):若栈S存在,插入新元素e到栈顶