java并发编程实战-32-使用condition重写wait和notify并实现一个有界的队列

package com.roocon.thread.ta7;

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

public class Tmall2 {

	private int count;

	private Lock lock = new ReentrantLock();
	Condition p = lock.newCondition();
	Condition t = lock.newCondition();

	public final int MAX_COUNT = 10;

	public void push() {
		lock.lock();
		while (count >= MAX_COUNT) {
			try {
				System.out.println(Thread.currentThread().getName() + " 库存数量达到上限,生产者停止生产。");
				p.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		count++;
		System.out.println(Thread.currentThread().getName() + " 生产者生产,当前库存为:" + count);
		t.signal();
		lock.unlock();
	}

	public void take() {
		lock.lock();
		while (count <= 0) {
			try {
				System.out.println(Thread.currentThread().getName() + " 库存数量为零,消费者等待。");
				t.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		count--;
		System.out.println(Thread.currentThread().getName() + " 消费者消费,当前库存为:" + count);
		p.signal();
		lock.unlock();
	}

}

改进下生产者和消费者。很简单。

--------------------------------------------------------------------------------------------------------------------------------------

实现有界的队列:入队满了需要等待,出队列的话为空需要等待。

package thread.tb1;

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

public class MyQueue<E> {

    private Object[] obj;
    private int addIndex;//添加的角标
    private int removeIndex;//删除的脚标
    private int queueSize;//队列的长度
    private Lock lock = new ReentrantLock();
    Condition addCondition = lock.newCondition();
    Condition removeCondition = lock.newCondition();
    public MyQueue(int count) {
        obj = new Object[count];
    }

    public void add(E e){
        lock.lock();
        while (queueSize == obj.length) {
            try {
                addCondition.await();
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
        obj[addIndex] = e;
        if (++addIndex == obj.length) {
            addIndex = 0;
        }
        queueSize++;
        removeCondition.signal();
        lock.unlock();
    }

    public void remove(){
        lock.lock();
        while (queueSize == 0) {
            try {
                removeCondition.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        obj[removeIndex] = null;
        if (++removeIndex == obj.length) {
            removeIndex = 0;
        }
        queueSize--;
        addCondition.signal();
        lock.unlock();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值