DelayQueue模拟TImer和scheduler

来源:互联网 发布:变号王软件免费下载 编辑:程序博客网 时间:2024/05/09 03:15
package concurrency.test;import static java.util.concurrent.TimeUnit.MILLISECONDS;import static java.util.concurrent.TimeUnit.NANOSECONDS;import java.util.ArrayList;import java.util.List;import java.util.concurrent.DelayQueue;import java.util.concurrent.Delayed;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import static util.Print.*;class DelayTaskScheduler implements Runnable,Delayed{private static int counter = 0;private static final int id = counter++;private final int delta;private final long trigger;protected static List<DelayTaskScheduler> sequence = new ArrayList<DelayTaskScheduler>();public DelayTaskScheduler(int delayInMillseconds){delta = delayInMillseconds;trigger = System.nanoTime() + NANOSECONDS.convert(delta, MILLISECONDS);sequence.add(this);}public void run(){print("Play this game");print(this + " ");}public int compareTo(Delayed o){DelayTaskScheduler dts = (DelayTaskScheduler)o;if(this.trigger < dts.trigger)return -1;if(this.trigger > dts.trigger)return 1;return 0;}public long getDelay(TimeUnit unit){return unit.convert(trigger - System.nanoTime(), NANOSECONDS);}@Overridepublic String toString(){return String.format("[%1$-4d]", delta) + " Task : " + id;}public String summary(){return "(" + id + " : " + delta + " )";}/** *用于关闭线程池 *  以及打印输出所有DelayedTask任务参数的一个小兵 */public static class Endsentinel extends DelayTaskScheduler{private ExecutorService exec = null;public Endsentinel(int delayInMillseconds, ExecutorService e){super(delayInMillseconds);exec = e;}public void run(){for (DelayTaskScheduler dst : sequence){print(dst.summary() + " ");}print();print(this + "Calling shutdownNow()");exec.shutdownNow();}}}class DelayTaskSchedulerConsumer implements Runnable{private DelayQueue<DelayTaskScheduler> q;public DelayTaskSchedulerConsumer(DelayQueue<DelayTaskScheduler> q){this.q = q;}public void run(){try{while(!Thread.interrupted()){q.take().run();}} catch (InterruptedException e){print("DelayTaskSchedulerConsumer InterruptedException");}print("Finished DelayTaskSchedulerConsumer");}}public class GreenhouseSchedulerDelayQueueDemo{public static void main(String args[]){ExecutorService exec = Executors.newCachedThreadPool();DelayQueue<DelayTaskScheduler> queue = new DelayQueue<DelayTaskScheduler>();for(int i = 0; i < 5; i++){queue.put(new DelayTaskScheduler(1000 * i));}queue.add(new DelayTaskScheduler.Endsentinel(5000, exec));exec.execute(new DelayTaskSchedulerConsumer(queue));}}


原创粉丝点击