通过Condition实现自己的阻塞队列

原创 2017年12月13日 20:29:44

    博主原文地址:点击打开链接

阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来

  阻塞队列常用在多线程环境中,在生产者与消费者模式中应用十分广泛

  阻塞队列的实现

package com.zhu.blockingqueue;

import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class MyBlockingQueue<E>{
	//默认的队列容量
	private static final int DEFAULT_CAPTITY=10;
	private ReentrantLock lock=new ReentrantLock();
	private Condition notFull=lock.newCondition();
	private Condition notEmpty=lock.newCondition();
	private E[] elements;
	//队列的容量
	private int capcity;
	//队列目前的所包含的元素个数
	private int size;
	//队列头
	private int head;
	//队列尾
	private int tail;
	public MyBlockingQueue(){
		this(DEFAULT_CAPTITY);
	}
	public MyBlockingQueue(int captity) {
		if(captity<0){
			throw new IndexOutOfBoundsException("index:"+captity);
		}
		this.capcity=captity;
		head=tail=0;
		elements=(E[]) new Object[captity]; 
	}
	public void put(E e) throws InterruptedException{
		lock.lock();
		try{
			while(size==capcity){
				notFull.await();
			}
			elements[tail]=e;
			++size;
			++tail;
			tail=tail==capcity?0:tail;
			
		}finally{
			notEmpty.signalAll();
			lock.unlock();
		}
	}
	public E take() throws InterruptedException{
		lock.lock();
		E e;
		try{
			while(size==0){
				notEmpty.await();
			}
			--size;
			e=elements[head++];
			head=head==capcity?0:head;
			return e;
		}finally{
			notFull.signalAll();
			lock.unlock();
		}
	}
}


Linux C++ 使用condition实现阻塞队列

/* * BlockingQueue.cpp * * Created on: 2014年6月10日 * Author: */ #include "../include/Bloc...
  • yingkongshi99
  • yingkongshi99
  • 2014年08月11日 21:24
  • 3888

Java阻塞队列的实现 (简洁明了)

阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2016年05月13日 21:51
  • 960

Java阻塞队列的实现

阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列...
  • sigangjun
  • sigangjun
  • 2015年08月19日 17:08
  • 4205

Java并发编程-阻塞队列(BlockingQueue)的实现原理

阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线...
  • chenchaofuck1
  • chenchaofuck1
  • 2016年06月13日 19:37
  • 28598

【java并发】阻塞队列的使用

在前面一篇名为条件阻塞Condition的应用的博客中提到了一个拔高的例子:利用Condition来实现阻塞队列。其实在java中,有个叫ArrayBlockingQueue的类提供了阻塞队列的功能,...
  • eson_15
  • eson_15
  • 2016年06月07日 09:27
  • 4358

Java可阻塞队列的两种实现方式

在Java中,对于Lock和Condition可以理解为对传统的synchronized和wait/notify机制的替代。 wait/notify有个限制,调用wait/notify的线程必须...
  • zhouweiIT
  • zhouweiIT
  • 2015年09月14日 18:21
  • 264

java 阻塞队列自定义实现

自定义阻塞队列:思路==》阻塞队列有这样一个特点,当队列中没有值得时候,这是只允许值得插入,当队列中有值得时候,这时候允许队列的插入,同时也允许队列中元素的移除,但是当队列中没有值得时候,这时候就不允...
  • fjkxyl
  • fjkxyl
  • 2017年03月21日 23:01
  • 294

线程中阻塞通信Condition的wait()和signal()

线程之间除了同步互斥,还要考虑通信。 在Java5之前我们的通信方式为:wait 和 notify。那么Condition的优势是支持多路等待,就是我可以定义多个Condition,每个condit...
  • dreamInTheWorld
  • dreamInTheWorld
  • 2014年08月26日 13:57
  • 1236

一步步编写并发阻塞队列

这篇文章主要介绍了linux中编写并发队列类,功能有:并发阻塞队列、有超时限制、有大小限制 设计并发队列 复制代码代码如下: #include #in...
  • wallwind
  • wallwind
  • 2016年03月14日 11:32
  • 6306

以钱柜娱乐开户环境为例的多线程学习笔记(三)-----------阻塞队列

对于许多多线程的问题,其实是可以通过使用一个或多个队列以安全的方式将其形式化的,即使用队列可以安全的从一个线程 向另一个线程传输数据。其中阻塞队列就是一种很有用的工具,工作者线程可以周期性的将中间结...
  • u011390632
  • u011390632
  • 2013年12月20日 20:38
  • 1646
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过Condition实现自己的阻塞队列
举报原因:
原因补充:

(最多只允许输入30个字)