java DelayedQueue延迟队列

Posted gc65

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java DelayedQueue延迟队列相关的知识,希望对你有一定的参考价值。

 

代码如下:

package com.example.base.concurrent;

import java.util.Date;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

import com.example.spring.MyLog;

public class MyDelayedQueue 
    public static void main(String[] args) throws InterruptedException 
        test();
    
    private static void test() throws InterruptedException 
        DelayQueue<DelayedTask> queue = new DelayQueue<>();
        producer(queue);
        MyLog.info("start take task from queue");
        //循环从队列中取数据
        while(!queue.isEmpty()) 
            //只有到期的数据才能取的出来,否则就阻塞等待
            MyLog.info(queue.take());
        
        
    
    private static void producer(DelayQueue<DelayedTask> queue) 
        for (int i = 0; i < 10; i++) 
            queue.put(new DelayedTask((10 - i) * 1000, "delayed taask"+i));
        
    
    
    public static void info(Object object) 
        System.out.println(new Date() + " [" + Thread.currentThread().getName() + "] " + object);
    
    
    private static class DelayedTask implements Delayed 
        private long delay;
        private long expire;
        private String msg;
        
        public DelayedTask(long delay, String msg) 
            this.delay = delay;
            this.msg = msg;
            this.expire = System.currentTimeMillis() + delay;
        

        /**
         * 用于延迟队列内部进行排序,将最先到期的放在队首,保证take出来的是到期的那个
         */
        @Override
        public int compareTo(Delayed o) 
            return (int)(this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
        

        /**
         * 指定到期时间计算规则
         */
        @Override
        public long getDelay(TimeUnit unit) 
            return unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
        

        @Override
        public String toString() 
            return "DelayedTask [delay=" + delay + ", expire=" + expire + ", msg=" + msg + "]";
        
    

执行结果如下:

2019-07-14T11:57:36.440+08:00 INFO [main] [[email protected]:17] -start take task from queue
2019-07-14T11:57:37.186+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=1000, expire=1563076657181, msg=delayed taask9]
2019-07-14T11:57:38.182+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=2000, expire=1563076658181, msg=delayed taask8]
2019-07-14T11:57:39.181+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=3000, expire=1563076659181, msg=delayed taask7]
2019-07-14T11:57:40.182+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=4000, expire=1563076660181, msg=delayed taask6]
2019-07-14T11:57:41.182+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=5000, expire=1563076661181, msg=delayed taask5]
2019-07-14T11:57:42.182+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=6000, expire=1563076662181, msg=delayed taask4]
2019-07-14T11:57:43.182+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=7000, expire=1563076663181, msg=delayed taask3]
2019-07-14T11:57:44.181+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=8000, expire=1563076664181, msg=delayed taask2]
2019-07-14T11:57:45.181+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=9000, expire=1563076665180, msg=delayed taask1]
2019-07-14T11:57:46.182+08:00 INFO [main] [[email protected]:19] -DelayedTask [delay=10000, expire=1563076666180, msg=delayed taask0]

 

以上是关于java DelayedQueue延迟队列的主要内容,如果未能解决你的问题,请参考以下文章

RedissonDelayedQueue源码解读

java延迟队列DelayQueue使用及原理

java延迟队列

Java延迟队列——DelayQueue

RabbitMQ--死信队列/延迟队列--使用/原理

用 RabbitMQ 延迟队列,实现消息延迟推送