package Thread.concurrent; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; /* * DelayQueue: * implements Delayed接口的类放在DelayQueue中,只有达到类规定的时间,才能从DelayQueue中通过take()方法取出,否则,take()阻塞 * 队列有序:即对头对象的延迟时间最长 * * * 创建一个Delayed,达到delay时间后从DelayedQueue中去除 * 从结果中可以看出::任务创建的顺序和执行顺序没有区别,执行时按照期望顺序执行的~~~ * */ public class DelayQueueTest { public static void main(String[] args) { DelayQueue queue=new DelayQueue(); ExecutorService service=Executors.newCachedThreadPool(); Random random=new Random(); for(int i=0;i delays=new ArrayList(); private int delay; private long trigger; public DelayedTask(int delay) { this.delay=delay; trigger=System.currentTimeMillis()+delay; delays.add(this); } @Override public int compareTo(Delayed o) { DelayedTask that=(DelayedTask) o; return (that.trigger delayQueue; public DelayTaskComsumer(DelayQueue delayQueue){ this.delayQueue=delayQueue; } public void run() { while(!Thread.interrupted()){ try { delayQueue.take().run(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }