Java并发-类库新组件 - DelayQueue 理解

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


程序详细的运行的说明,已经在注释之中进行标注了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值