java DelayQueue方法的总结

java DelayQueue方法的总结,第1张

java DelayQueue方法的总结

本教程 *** 作环境: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 key = (Comparable)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) c).compareTo((E) queue[right]) > 0)
                //right

以上就是java中DelayQueue方法的总结,每种不同的方法都有其独特的使用而存在,大家在使用DelayQueue的时候,可以根据实际需求进行挑选。一些常见方法我们已经介绍过了,这里就不再叙述。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/3017587.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-28
下一篇 2022-09-28

发表评论

登录后才能评论

评论列表(0条)

保存