本教程 *** 作环境:windows7系统、java10版,DELL G3电脑。
1.DelayQueue方法
take()
获取并移除此队列的头部,在可从此队列获得到期延迟的元素之前一直等待(如有必要)。
put(E)
将指定元素插入此延迟队列。
offer(E)
将指定元素插入此延迟队列。
poll()
获取并移除此队列的头,如果此队列不包含具有已到期延迟时间的元素,则返回 null。
peek()
获取但不移除此队列的头部;如果此队列为空,则返回 null。
size()
返回此 collection 中的元素数。
clear()
自动移除此延迟队列的所有元素。
2.DelayQueue使用实例
poll用法
public E poll() { final ReentrantLock lock = this.lock; lock.lock(); try { E first = q.peek(); if (first == null || first.getDelay(NANOSECONDS) > 0) return null; else return q.poll(); } finally { lock.unlock(); } }
remove用法
public boolean remove(Object o) { final ReentrantLock lock = this.lock; lock.lock(); try { return q.remove(o); } finally { lock.unlock(); } } public boolean remove(Object o) { int i = indexOf(o); if (i == -1) return false; else { //找到将要移除元素的在数组 removeAt(i); return true; } } private int indexOf(Object o) { if (o != null) { for (int i = 0; i < size; i++) if (o.equals(queue[i])) return i; } return -1; } @SuppressWarnings("unchecked") private E removeAt(int i) { // assert i >= 0 && i < size; modCount++; //modCount++,其他线程用以确保没有并其他线程修改 int s = --size; //先将数组减-1 if (s == i) // removed last element //i是从0开始的,size是从1开始的;s==i那么i就是最后一个叶子节点 queue[i] = null; else { //将最后一个节点的元素取出赋值为moved E moved = (E) queue[s]; //先将原树的最后一个叶子节点设为空 queue[s] = null; //将最后一个节点补到i位置位置去,从那里开始用siftDown构建堆 siftDown(i, moved); //siftDown了一圈后发现最后一节点到了i位置 if (queue[i] == moved) { //用siftUp继续构建堆 siftUp(i, moved); //如果原来的位置上的节点 if (queue[i] != moved) return moved; } } return null; } private void siftDown(int k, E x) { if (comparator != null) siftDownUsingComparator(k, x); else siftDownComparable(k, x); } @SuppressWarnings("unchecked") private void siftDownComparable(int k, E x) { //k为将要移除节点的索引值,x为入堆的数据 Comparable super E> key = (Comparable super E>)x; int half = size >>> 1; // loop while a non-leaf //size>>>1就是size/2,不知道干啥的还 while (k < half) { //当half大于0,就一直执行;k<<1代表左移一位,也就是k*2,k*2+1就是这个节点的左节点,k*2+2就是这个节点的右节点 int child = (k << 1) + 1; // assume left child is least Object c = queue[child]; int right = child + 1; //right这个是右节点的索引,c是左节点的值 if (right < size && ((Comparable super E>) c).compareTo((E) queue[right]) > 0) //right以上就是java中DelayQueue方法的总结,每种不同的方法都有其独特的使用而存在,大家在使用DelayQueue的时候,可以根据实际需求进行挑选。一些常见方法我们已经介绍过了,这里就不再叙述。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)