code show as below:
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 = newA DelayQueue <> (); Producer (Queue); MyLog.info ( "Start from Take Task Queue" ); // cycle takes data from the queue the while (! Queue.isEmpty ()) { // data only due to taken out, otherwise blocking wait MyLog.info (queue.take ()); } } Private static void Producer (a DelayQueue <DelayedTask> Queue) { for ( int I = 0; I <10; I ++ ) { queue.put ( new 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= System.currentTimeMillis .expire () + Delay; } / ** * for delaying the internal queue are sorted on the first head of the queue expires, take to ensure that it is due * / @Override public int the compareTo (the DelayedPause O) { return ( int ) ( the this .getDelay (TimeUnit.MILLISECONDS) - o.getDelay (TimeUnit.MILLISECONDS)); } / ** * specified expiration time calculation rule * / @Override public Long getDelay (TimeUnit Unit) { return unit.convert ( the this .expire - System.currentTimeMillis (), TimeUnit.MILLISECONDS); } @Override public String toString() { return "DelayedTask [delay=" + delay + ", expire=" + expire + ", msg=" + msg + "]"; } } }
Execution results are as follows:
2019-07-14T11:57:36.440+08:00 INFO [main] [MyDelayedQueue.java@test:17] -start take task from queue 2019-07-14T11:57:37.186+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=1000, expire=1563076657181, msg=delayed taask9] 2019-07-14T11:57:38.182+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=2000, expire=1563076658181, msg=delayed taask8] 2019-07-14T11:57:39.181+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=3000, expire=1563076659181, msg=delayed taask7] 2019-07-14T11:57:40.182+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=4000, expire=1563076660181, msg=delayed taask6] 2019-07-14T11:57:41.182+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=5000, expire=1563076661181, msg=delayed taask5] 2019-07-14T11:57:42.182+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=6000, expire=1563076662181, msg=delayed taask4] 2019-07-14T11:57:43.182+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=7000, expire=1563076663181, msg=delayed taask3] 2019-07-14T11:57:44.181+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=8000, expire=1563076664181, msg=delayed taask2] 2019-07-14T11:57:45.181+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=9000, expire=1563076665180, msg=delayed taask1] 2019-07-14T11:57:46.182+08:00 INFO [main] [MyDelayedQueue.java@test:19] -DelayedTask [delay=10000, expire=1563076666180, msg=delayed taask0]