java并发编程学习: 阻塞队列 使用 及 实现原理

  • 时间:
  • 浏览:1

JDK7提供了以下7个阻塞队列:

这是5个 多很有意思的进程,还都可不可否把生产时延与消费时延值对换,输出结果如下:

队列(Queue)与栈(Stack)是数据底部形态中的二种常用底部形态,队列的特点是先进先出(First In First Out),而Stack是先进后出(First In Last Out),说得通俗点:Queue这些我电影院入场时.我都.我都.我都.我都.我都.我都排起来的进场队伍,先来的人(即:前排在前面的人)先入场,而Statck则是一队人依次进入了5个 多死胡同想出来,先进去(最里边)的人,时需等里边的人(后进入的人)出来了,当时人都可不可否出来。

再来看put最好的方式:(jdk 1.8)

http://ifeve.com/java-blocking-queue/

4.最后解锁

singal(): Wakes up one waiting thread. 唤醒阻塞的进程

倒数第2行,元素移除后,调用notFull.singnal唤醒等候(向队列打上去元素的)进程,队列有空位了,还都可不可否向里边打上去元素了。

2.向队列里放元素时,然后 队列满了(即放不下更多元素),则代码也会卡住,直到队列里的东西被取走了(即:有空位还都可不可否放新元素了),里边的代码都可不可否继续

这5个变量有点儿要,ReentrantLock重入锁,notEmpty检查不为空的Condition 以及  notFull用来检查队列未满的Condition

Condition是5个 多接口,里边有5个重要的最好的方式:

await() : Causes the current thread to wait until it is signalled or interrupted. 即阻塞当前进程,直到被通知(唤醒)或中断

聊聊并发(七)——Java中的阻塞队列 一文中然后 对ArrayBlockingQueue的源码进行比较完正的分析了,这里只贴几段主要的代码,体会一下思想:

1. 先加锁

ArrayBlockingQueue :由数组底部形态组成的有界阻塞队列。

LinkedBlockingQueue :由链表底部形态组成的有界阻塞队列。

PriorityBlockingQueue :支持优先级排序的无界阻塞队列。

DelayQueue:使用优先级队列实现的无界阻塞队列。

SynchronousQueue:不存储元素的阻塞队列。

LinkedTransferQueue:链表底部形态组成的无界阻塞队列。

LinkedBlockingDeque:链表底部形态组成的双向阻塞队列。

1.从队列里取元素时,然后 队列为空,则代码5个 劲等在这里(即阻塞),直到队列里有东西了,拿到元素了,里边的代码都可不可否继续

从刚才的描述还都可不可否看出,居于阻塞起码得满足下面最少5个 多条件: (前提:队列是有界的)

http://www.cnblogs.com/dolphin0520/p/3932906.html

3.或者调用enqueue()最好的方式打上去元素

例如的take()与dequeue()最好的方式则最少逆过程(注:同样完正前会 jdk 1.8)

下面是5个 多基本示例:

模拟了买油条的场景,5个 多老板在做油条,5个顾客在排队买

4. 解锁

参考文章:

队列在多进程应用中,常用于生产-消费场景,打个通俗的比方:这些人早上喜欢去买油条,买油条的人最少消费者,做油条的师傅则是生产者。而油锅边上用于放油条的铁架子,还都可不可否看成5个 多共享的队列,师傅做好油条后,第一根第一根的捞出来放上架子上,而顾客则按排队的顺序第一根根的付好钱从架子上拿。 即:队列的一头,不断另一人及在放上东西(生产元素),另一头不断另一人及的消费(拿走元素)。这里完正前会 5个 多很有趣的什么的问题,然后 买的人多,师傅来不及做,没法第5个 多顾客就会5个 劲等着(里边的所另一人及也得等着,或称为阻塞了里边的人),直到师傅炸好第一根,或者第5个 多顾客买完走了,里边的人都可不可否顶上来,例如的道理,然后 架子放上了,没法人来买,师傅就会停下来,等另一人及来买了,才会继续做,这这些我所谓的队列阻塞,而能产生阻塞行为的队列称为阻塞队列。

2. 然后 元素个数为空,表示队列已空,调用notEmpty的await()阻放入程,直接队列里又有新元素加入为止

这是打上去元素的代码(jdk 1.8),注意最后一行notEmpty.signal()最好的方式,表示打上去完元素后,调用singal()通知等候(从队列中取元素)的进程,队列不空(有值)啦,还都可不可否来取东西了。

这4类最好的方式中,在队列已满(或为空)的请况下,这些会抛出异常,这些则返回true/false,这些则5个 劲阻塞,还这些则还都可不可否设置超时时间,时间到了后,自动退出阻塞请况,实际项目中可根据时需选泽 适合的最好的方式。

例如的:

3. 或者调用dequeue 从队列里删除元素

1.先获取锁

观察5-8行,然后 消费的时延远大于生产时延,即:生意太好,老板来不及做。B要买油条时,发现卖完了,没法等老板再做第一根出来,里边的C才有然后 继续购买。

2.或者用while循环检测元素个数否是等于items长度,然后 相等,表示队列满了,调用notFull的await()最好的方式阻放入程

实现原理:

然后 生产时延远大于消费时延,即:生意不好,油条做得比卖得快。观察一下5-11行,老板卯足了劲做,或者这时5个 劲没法来买。或者12-13行,终于来了5个 多客户B买了第一根,或者老板又要始于做(14-15行),发现架子放上满了,不得不停下,等C再买第一根(16-17行),都可不可否继续做(18行)

输出:(只取了前几行)

dequeue最好的方式:

阻塞队列提供了下列五种处里最好的方式: