使用Condition(条件锁)实现有序队列

使用Condition(条件锁)实现有序队列

/**

  • 有序队列
    */
    public class ScopeQueue {

    private Object[] objects;//元素存放队列

    private int addIndex;//添加角标

    private int removeIndex;//删除角标

    private volatile int size;//队列元素个数

    private Lock lock=new ReentrantLock();
    private Condition addLock=lock.newCondition();//添加条件锁
    private Condition removeLock=lock.newCondition();//删除条件锁

    //默认长度队列
    public ScopeQueue() {
    this.objects = new Object[10];
    }

    //指定长度队列 构造
    public ScopeQueue(int length) {
    this.objects = new Object[length];
    }

    //添加方法
    public void add(E e){
    lock.lock();
    while (sizeobjects.length){
    //这里表示队列已经满了,则不添加。
    try {
    removeLock.signalAll();//唤醒所有的删除线程
    System.out.println(Thread.currentThread().getName()+" 移除线程进行唤醒。。。。。。");
    System.out.println(Thread.currentThread().getName()+" 添加线程进行等待。。。。。。");
    addLock.await();//使当前线程沉睡
    } catch (InterruptedException e1) {
    e1.printStackTrace();
    }
    }
    objects[addIndex]=e;//将元素添加进去 然后指针往后移。
    System.out.println(Thread.currentThread().getName()+" 添加 "+e);
    size++;//队列长度+1。
    if (++addIndex
    objects.length){//将添加索引重置
    addIndex=0;
    }
    lock.unlock();
    }

    //删除方法
    public void remove(){
    lock.lock();
    while (size0){
    //这里表示队列已经没有元素了,进行等待。
    try {
    addLock.signalAll();//唤醒所有的添加线程
    System.out.println(Thread.currentThread().getName()+" 添加线程进行唤醒。。。。。。");
    System.out.println(Thread.currentThread().getName()+" 移除线程进行等待。。。。。。");
    removeLock.await();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    System.out.println(Thread.currentThread().getName()+" 删除 "+objects[removeIndex]);
    objects[removeIndex]=null;//将元素置为null
    size–;//队列长度-1
    if (++removeIndex
    objects.length){
    removeIndex=0;
    }
    lock.unlock();
    }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值