packageDate_pacage;publicclassArrayQueue<E>implementsQueue<E>{publicstaticvoidmain(String[] args) { ArrayQueue<Integer> queue =newArrayQueue<>();for(inti = 0 ; i < 10 ; i++) { queue.enqueue(i); System.out.println(queue); } }privateArray<E>array;publicArrayQueue(intcapacity) { array...
第一步:创建Queue<E>接口,定义ArrayQueue的一般操作 1publicinterfaceQueue<E>{2intgetSize();3voidenqueue(E e);4E dequeue();5intgetCapacity();6booleanisEmpty();7} 主要的两个操作是enqueue(入队)和dequeue(出队),我们的标准是,以动态数组尾部为队列尾~以动态数组首位Array[0]位置为队列首,为了保证队...
queue.enqueue(1); queue.enqueue(2); queue.enqueue(3); ``` 这里我们添加了三个元素,值分别为1、2、3。现在我们可以通过peek方法查看队列头元素: ```java System.out.println(queue.peek()); ``` 输出结果为1,因为1是最先入队的元素。如果我们需要取出队头元素,可以使用dequeue方法: ```java System....
如果判断是if,A在E释放锁资源后,拿到锁资源,直接走enqueue方法。 此时A线程就是在putIndex的位置,覆盖掉之前的数据,造成数据安全问题
ArrayBlockingQueue类 enqueue和dequeue两个方法是该类内部使用的方法,负责维护数组的队列功能。enqueue是入队操作,通过putIndex索引定位插入的位置,如果索引超过了队列的最大长度则索引从头开始,同时让长度加一并向notEmpty条件发送信号。类似地,dequeue是出队操作,通过takeIndex索引定位取出的位置,如果索引超过了队列的最大...
public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0) throw new IllegalArgumentException(); //1、初始化一个长度为capacity的数组,这里传的是10 this.items = new Object[capacity]; //2、初始化一个可重入锁 lock = new ReentrantLock(fair); //3、初始化一个非空Condition not...
enqueue()利用放指针循环使用数组来存储元素; 出队 take方法出队 从头部出队队中没有数据,等待被唤醒再取数据。 public E take() throws InterruptedException { final ReentrantLock lock = this.lock; //加锁,如果线程中断了抛出异常 lock.lockInterruptibly(); try { //队列中不存元素 while (count == 0...
publicArrayBlockingQueue(int capacity, boolean fair) {if (capacity <= )thrownew IllegalArgumentException();//初始化数组,容量为capacitythis.items = new Object[capacity];//初始化锁,true为公平锁,false为非公平锁lock = new ReentrantLock(fair);//初始化两个条件队列 notEmpty = lock.newCondition...
ArrayBlockingQueue的入队出队操作 两个指针都是从队首向队尾移动,保证队列的先进先出原则! 入队阻塞对象notFull:队列count=length,放不进去元素时,阻塞在该对象上。 出队阻塞对象notEmpty:队列count=0,无元素可取时,阻塞在该对象上。 入队操作:从队首开始添加元素,记录putIndex(到队尾时设置为0),唤醒notEmpty...
notEmpty与notFull都是通过lock创建,都是在初始化ArrayBlockingQueue是初始化出来。这里简单介绍了属性的作用,接下来会通过源码再来理解它的作用。最关键的两个私有方法 首先要说两个私有方法,应该队列主要的方法最后都依赖这两个私有方法,直接看源码如下图:enqueue方法用来把数据保存到数组items中,会递增putIndex,...