欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

java阻塞队列实现原理及实例解析

时间:2020-10-20 15:01:34|栏目:JAVA代码|点击:

这篇文章主要介绍了java阻塞队列实现原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

阻塞队列与普通队列的不同在于。当队列是空的时候,从队列中获取元素的操作将会被阻塞,或者当队列满时,往队列里面添加元素将会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列,下图展示了如何通过阻塞队列来合作:

线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素

从5.0开始,JDK在Java.util.concurrent包里提供了阻塞队列的官方实现。尽管JDK中已经包含了阻塞队列的官方实现。

阻塞队列的实现

阻塞队列的实现类似于带上限的Semaphore的实现。

废话不多说:

package com.huojg.test;
import java.util.LinkedList;
import java.util.List;
public class BlockingQueue { 
   private List queue = new LinkedList(); 
   private int limit = 10;    
   public BlockingQueue(int limit){ 
    this.limit = limit; 
   }      
   public synchronized void enqueue(Object item) 
   throws InterruptedException { 
    while(this.queue.size() == this.limit) { 
     wait(); 
    } 
    if(this.queue.size() == 0) { 
     notifyAll(); 
    } 
    this.queue.add(item); 
   }   
   public synchronized Object dequeue() 
   throws InterruptedException{ 
    while(this.queue.size() == 0){ 
     wait(); 
    } 
    if(this.queue.size() == this.limit){ 
     notifyAll(); 
    } 
    return this.queue.remove(0); 
   } 
  } 

必须注意到,在enqueue和dequeue方法内部,只有队列的大小等于上限(limit)或者下限(0)时,才调用notifyAll方法。如果队列的大小既不等于上限,也不等于下限,任何线程调用enqueue或者dequeue方法时,都不会阻塞,都能够正常的往队列中添加或者移除元素。

在Java中,对于Lock和Condition可以理解为对传统的synchronized和wait/notify机制的替代。

wait/notify有个限制,调用wait/notify的线程必须持有对象的锁。

上一篇:解决java页面URL地址传输参数乱码的方法

栏    目:JAVA代码

下一篇:利用java实现邮箱群发功能

本文标题:java阻塞队列实现原理及实例解析

本文地址:http://www.codeinn.net/misctech/14025.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有