黑马程序员-java-condition-实现线程通信和可阻塞队列

本文介绍了一个基于Java的Condition接口实现的可阻塞队列。该队列使用两个Condition来区分等待放入元素和取出元素的操作,确保了线程间的正确同步与通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

----------------------android培训java培训、期待与您交流! ----------------------

这个代码在java的 api 中的 Condition 这个类中。我这里就是解释了一下各个代码的作用觉得这个代码确实有点技术含量所以贴出来;

实现的是一个可阻塞的队列。和线程间的互斥。通信

/** 这里用了两个 Condition 就是为了再发通知的时候是发给 可以放或者可以取的对象
	  如果只用一个 有多个等着放 发通知则是会唤醒放的。而没有唤醒取的 */
	Lock lock = new ReentrantLock();
	Condition notFull = lock.newCondition(); // 非空
	Condition notEmpty = lock.newCondition(); // 不满
	private final Object [] items = new Object[100]; // 缓冲队列宿主
	private int count;  // 统计缓冲队列中的记录数
	private int putptr; // 放数据的下标
	private int takeptr;  // 取数据的下标
	
	public void put(Object obj){
		try {
			lock.lock();
			while(count == items.length){ // 如果 cont = 100 不能在放了就阻塞
				notFull.await();
			}
			items[putptr] = obj; // 如果能接着放
			if(++putptr == items.length) putptr = 0; // 当放到最后一个修改下标  putptr = 0
			++count; 								 // 修改 count 的值
			notEmpty.signal();						 // 通知取的可以取了
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}

	public Object get(){
		try {
			lock.lock();
			while(count == 0){ 		// 如果没有数据不能取就等待
				notEmpty.await();
			}
			Object retVal = items[takeptr]; 		//如果有数据就取出
			if(++takeptr == items.length) takeptr = 0; //取出一个下标加一 准备取下一个
			--count;								// 记录数减一
			notFull.signal();						//取出数据后可以接着放通知 放的继续放
			return retVal;
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
		return null;
	}
	


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值