java 之 阻塞队列实现

原创 2012年03月22日 00:00:08
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 阻塞队列
 * @author ETHAN
 *
 */
public class BoundedBuffer {
	final Lock lock = new ReentrantLock();
	final Condition notFull = lock.newCondition();
	final Condition notEmpty = lock.newCondition();
	
	final Object[] items = new Object[100];
	int putptr, takeptr,count;
	
	public void put(Object x) throws InterruptedException {
		lock.lock();
		try {
			//如果已经放满了
			while(count==items.length) {
				//发现满了就等
				notFull.await();
			}
			items[putptr] = x;
			
			if(++putptr==items.length) putptr=0;
			
			++count;
			//只唤醒 取的线程(有放的和取的线程)
			notEmpty.signal();
		} finally {
			lock.unlock();
		}
	}
	
	public Object take() throws InterruptedException {
		lock.lock();
		try {
			//如果已经放满了
			while(count==0) {
				//获得通知后,干下边的活
				//发现空了,就着了
				notEmpty.await();
			}
			
			Object x = items[takeptr];
			
			if(++takeptr==items.length) takeptr=0;
			
			--count;
			notFull.signal();
			return x;
		} finally {
			lock.unlock();
		}
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java中在特定区间产生随机数

生成指定范围内的随机数 这个是最常用的技术之一。程序员希望通过随机数的方式来处理众多的业务逻辑,测试过程中也希望通过随机数的方式生成包含大量数字的测试用例。问题往往类似于: 如何随机生成 1~100 ...
  • EthanQ
  • EthanQ
  • 2012-03-22 15:25
  • 21244

Android 之 电灯泡开关效果

  • EthanQ
  • EthanQ
  • 2012-03-30 00:08
  • 3038

一场演讲 百年震撼

王财贵博士北师大讲座      一场演讲 百年震撼——2001年王财贵老师暑期大陆巡回讲座                北京师范大学讲演       ...
  • yxwzjq
  • yxwzjq
  • 2006-08-17 18:44
  • 1346
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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