package com.xyw.concurrent.blog;
import java.util.concurrent.*;
import java.util.*;
import static java.util.concurrent.TimeUnit.*;
class DelayedTask implements Runnable, Delayed{
private static int counter = 0;
private final int id = counter++; // 任务的唯一标识,表示着任务生成的顺序
private final int delta; // 延迟的时间
private final long trigger; // 引发
protected static List<DelayedTask> sequence =
new ArrayList<DelayedTask>(); // 静态的ArrayList 表示,任务生成的顺序
public DelayedTask(int delayInMilliseconds){
this.delta = delayInMilliseconds;
trigger =System.nanoTime() + NANOSECONDS.convert(delta, MILLISECONDS);
sequence.add(this);
}
public long getDelay(TimeUnit unit){
return unit.convert(trigger-System.nanoTime(), NANOSECONDS);
}
public int compareTo(Delayed arg){ // 实现 compareTo 的定向的接口
DelayedTask that = (DelayedTask) arg;
if(trigger < that.trigger) return -1;
if(trigger > that.trigger) return 1;
return 0;
}
public void run(){
System.out.println(this + " ");
}
public String toString(){
return String.format("[%1$-4d]", delta) + "Task" + id;
}
public String summary(){
return "(" + id + ":" + delta + ")";
}
public static class EndSentinel extends DelayedTask{ // 这个是结束任务,并传入线程的引用用于结束任务
private ExecutorService exec;
public EndSentinel(int delay, ExecutorService e){
super(delay);
exec = e;
}
public void run(){
for(DelayedTask pt : sequence){
System.out.println(pt.summary() + " ");
}
System.out.println();
System.out.println(this + " Calling shutdownnow");
exec.shutdownNow(); // 结束线程,不同于 shutdown
}
}
}
class DelayedTaskConsumer implements Runnable{
private DelayQueue<DelayedTask> q;
public DelayedTaskConsumer(DelayQueue<DelayedTask> q){
this.q = q;
}
public void run(){
try{
while(!Thread.interrupted()){
q.take().run(); //从队列之中取出任务,进行消耗队列之中的任务
}
}catch(InterruptedException e){
}
System.out.println("Finished DelayedTaskConsumer");
}
}
public class DeleyQueueDemo {
public static void main(String[] args){
Random rand = new Random(47);
ExecutorService exec = Executors.newCachedThreadPool();
DelayQueue<DelayedTask> queue = new DelayQueue<DelayedTask>();
for(int i = 0 ; i < 20; i++){
queue.put(new DelayedTask(rand.nextInt(5000)));
}
queue.add(new DelayedTask.EndSentinel(5000, exec)); // 添加结束时的任务
exec.execute(new DelayedTaskConsumer(queue)); //开始运行延迟队列。
}
}
运行结果:
[128 ]Task11
[200 ]Task7
[429 ]Task5
[520 ]Task18
[555 ]Task1
[961 ]Task4
[998 ]Task16
[1207]Task9
[1693]Task2
[1809]Task14
[1861]Task3
[2278]Task15
[3288]Task10
[3551]Task12
[4258]Task0
[4258]Task19
[4522]Task8
[4589]Task13
[4861]Task17
[4868]Task6
(0:4258)
(1:555)
(2:1693)
(3:1861)
(4:961)
(5:429)
(6:4868)
(7:200)
(8:4522)
(9:1207)
(10:3288)
(11:128)
(12:3551)
(13:4589)
(14:1809)
(15:2278)
(16:998)
(17:4861)
(18:520)
(19:4258)
(20:5000)
[5000]Task20 Calling shutdownnow
Finished DelayedTaskConsumer