资讯专栏INFORMATION COLUMN

java并发编程学习之DelayQueue

miqt / 1263人阅读

摘要:示例模拟五秒钟后获取信息必须实现接口存活时间加当前时间剩余时间

示例

模拟五秒钟后获取信息

public class DelayQueueDemo {
    static class DelayedVo implements Delayed {//必须实现Delayed接口
        private long activeTime;
        private String name;

        public DelayedVo(String name, long activeTime) {
            this.name = name;
            this.activeTime = TimeUnit.NANOSECONDS.convert(activeTime, TimeUnit.MILLISECONDS) + System.nanoTime();//存活时间加当前时间
        }

        @Override
        public long getDelay(TimeUnit unit) {
            return unit.convert(activeTime - System.nanoTime(), TimeUnit.NANOSECONDS);//剩余时间
        }

        @Override
        public int compareTo(Delayed o) {
            long t = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
            return t == 0 ? 0 : (t > 0 ? 1 : -1);
        }

        public String getName() {
            return name;
        }
    }
    static class ReadThread implements Runnable {
        private DelayQueue queue;

        public ReadThread(DelayQueue queue) {
            this.queue = queue;
        }

        @Override
        public void run() {
            try {
                DelayedVo delayedVo = queue.take();
                System.out.println(delayedVo.getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    static class WriteThread implements Runnable {
        private DelayQueue queue;

        public WriteThread(DelayQueue queue) {
            this.queue = queue;
        }

        @Override
        public void run() {
            DelayedVo delayedVo = new DelayedVo("abc", 5000);
            queue.put(delayedVo);
        }
    }

    public static void main(String[] args) {
        DelayQueue queue =new DelayQueue<> ();
        new Thread(new WriteThread(queue)).start();
        new Thread(new ReadThread(queue)).start();
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75676.html

相关文章

  • java并发编程习之阻塞队列

    摘要:是线程安全的存取队列,继承了。接口插入方法阻塞队列满了,抛出异常。如果队列不为空,返回头结点但不删除,如果队列为空,返回子类一个由数组结构组成的有界阻塞队列。一个由链表结构组成的有界阻塞队列。一个支持优先级排序的无界阻塞队列。 BlockingQueue BlockingQueue是线程安全的存取队列,继承了Queue。 使用场景 消费者生产者模式。 生产者,一直会往队列里扔数据,直...

    YJNldm 评论0 收藏0
  • java并发编程习之synchronize(一)

    摘要:线程安全问题在并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。那么,该怎么解决呢,很简单,在方法前加个同步锁。运行结果如下有两种情况,是因为看谁先抢占锁,但是输出的算法结果是正确的。 线程安全问题 在java并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。 public class NotSafeDemo { ...

    Elle 评论0 收藏0
  • java并发编程习之再谈公平锁和非公平锁

    摘要:在并发编程学习之显示锁里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在源码分析的基础上,我们看看和的区别在什么地方。而非公平锁直接尝试获取锁。 在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方。 lock方法 ...

    warkiz 评论0 收藏0
  • java并发编程习之FutureTask

    摘要:在并发编程学习之三种线程启动方式中有提过。是否执行结束,包括正常执行结束或异常结束。获取返回值,没有得到返回值前一直阻塞。运行结果如下由于任务被取消,所以抛出异常。注意的是,此时线程还在跑,和返回的是。并不能让任务真正的结束。 FutureTask 在java并发编程学习之三种线程启动方式中有提过。主要的方法如下: cancel(boolean mayInterruptIfRunni...

    BothEyes1993 评论0 收藏0
  • java并发编程习之Volatile

    摘要:但是的语义不足以确保递增操作的原子性,在多线程的情况下,线程不一定是安全的。检查某个状态标记,以判断是否退出循环某个方法这边和用普通的变量的区别是,在多线程的情况下,取到后,的值被改变了,判断会不正确。 多线程为什么是不安全的 这边简单的讲述一下,参考java并发编程学习之synchronize(一) 当线程A和线程B同时进入num = num + value; 线程A会把num的值...

    thekingisalwaysluc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<