本教程操作环境: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的时候,可以根据实际需求进行挑选。一些常见方法我们已经介绍过了,这里就不再叙述。



