美文网首页
自己实现阻塞有界队列

自己实现阻塞有界队列

作者: wuyuan0127 | 来源:发表于2018-04-28 15:15 被阅读0次

    import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 有界队列 (FIFO) * @author wuy * * @param*/

    public class ArrayQueue {

    Object[] objs;

    //实例化 锁

    private Lock lock = new ReentrantLock();

    //入队 condition

    Condition addCondition = lock.newCondition();

    //出对 condition

    Condition takeCondition = lock.newCondition();

    //入队角标

    private int addIndex;

    //出队角标

    private int removeIndex;

    //队列长度

    private int queueSize;

    public ArrayQueue(int size){

    objs = new Object[size];

    }

    final int inc(int i) {

            return (++i == objs.length) ? 0 : i;

        }

    /**

    * 往队列里面添加 元素

    * @param e

    */

    public void add(E e){

    lock.lock();

    while (queueSize == objs.length) {

    try {

    addCondition.await();

    } catch (InterruptedException e1) {

    e1.printStackTrace();

    }

    }

    objs[addIndex] = e;

    addIndex = inc(addIndex);

    ++queueSize;

    takeCondition.signal();

    lock.unlock();

    }

    /**

    * 获取最早添加的元素

    */

    @SuppressWarnings("unchecked")

    public E take(){

    lock.lock();

    try {

    while(queueSize == 0){

    try {

    takeCondition.await();

    } catch (InterruptedException e1) {

    e1.printStackTrace();

    }

    }

    E e = (E)objs[removeIndex];

    objs[removeIndex] = null;

    removeIndex = inc(removeIndex);

    --queueSize;

    addCondition.signal();

    return e;

    }finally{

    lock.unlock();

    }

    }

    }

    相关文章

      网友评论

          本文标题:自己实现阻塞有界队列

          本文链接:https://www.haomeiwen.com/subject/nmpglftx.html