栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java DelayQueue方法的总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/15158.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号