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....
ArrayBlockingQueue类 enqueue和dequeue两个方法是该类内部使用的方法,负责维护数组的队列功能。enqueue是入队操作,通过putIndex索引定位插入的位置,如果索引超过了队列的最大长度则索引从头开始,同时让长度加一并向notEmpty条件发送信号。类似地,dequeue是出队操作,通过takeIndex索引定位取出的位置,如果索引超过了队列的最大...
enqueue()利用放指针循环使用数组来存储元素; 出队 take方法出队 从头部出队队中没有数据,等待被唤醒再取数据。 public E take() throws InterruptedException { final ReentrantLock lock = this.lock; //加锁,如果线程中断了抛出异常 lock.lockInterruptibly(); try { //队列中不存元素 while (count == 0...
ArrayBlockingQueue在初始化的时候,必须指定当前队列的长度。 因为ArrayBlockingQueue是基于数组实现的队列结构,数组长度不可变,必须提前设置数组长度信息。 public static void main(String[] args) throws ExecutionException, InterruptedException, IOException {
publicArrayBlockingQueue(int capacity, boolean fair) {if (capacity <= )thrownew IllegalArgumentException();//初始化数组,容量为capacitythis.items = new Object[capacity];//初始化锁,true为公平锁,false为非公平锁lock = new ReentrantLock(fair);//初始化两个条件队列 notEmpty = lock.newCondition...
ArrayBlockingQueue的offer (e)方法源码如下: public boolean offer(E e) { Objects.requireNonNull(e); final ReentrantLock lock = this.lock; lock.lock(); // 加锁 try { if (count == items.length) return false; else { enqueue(e); // 入队 return true; } } finally { lock.unlock(); /...
notEmpty与notFull都是通过lock创建,都是在初始化ArrayBlockingQueue是初始化出来。这里简单介绍了属性的作用,接下来会通过源码再来理解它的作用。最关键的两个私有方法 首先要说两个私有方法,应该队列主要的方法最后都依赖这两个私有方法,直接看源码如下图:enqueue方法用来把数据保存到数组items中,会递增putIndex,...
enqueue()方法逻辑比较简单,就是将元素添加到链表的尾部。 出队列 LinkedBlockingQueue的出队列方法,是先获取出队列的takeLock,然后再执行出队列方法。 take方法和poll方法前者在队列为空后,会阻塞出队列的线程,后者poll方法则不会在队列为空时阻塞出队列线程,会直接返回null。