Fork me on GitHub

4. 带有延迟时间的Queue(DelayQueue)

package com.gf.conn013;

import java.util.concurrent.DelayQueue;

/**
 * DelayQueue: 带有延迟时间的Queue,其中的元素只有当其指定的延迟时间到了,才能够从队列中获取改元素
 *             DelayQueue中的元素必须实现Delay接口,
 *             DelayQueue是一个没有大小限制的队列,
 *             应用场景很多,比如对缓存超时的数据进行移除、任务超时处理、空闲连接的关闭等等
 * 
 * @author huanchu
 *
 */
public class WangBa implements Runnable{
	
	
	private DelayQueue<Wangmin> queue = new DelayQueue<Wangmin>();
	
	private boolean yinye = true;
	
	public void shangji(String name , String id , int money){
		Wangmin man = new Wangmin(name , id , 1000 * money + System.currentTimeMillis());
		
		System.out.println("网名"+man.getName() + " 身份证" + man.getId() + " 交钱" + money + "块 ,开始上机了...");
		
		this.queue.add(man);
	}
	
	public void xiaji(Wangmin man){
		System.out.println("网民"+ man.getName() + "下机了...");
	}
	
	@Override
	public void run() {
		while (yinye){
			try {
				Wangmin man = queue.take();
				xiaji(man);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		try {
			System.out.println("网吧开始营业");
			
			WangBa siyu = new WangBa();
			
			new Thread(siyu).start();
			
			siyu.shangji("路人甲", "123", 1);
			siyu.shangji("路人乙", "234", 10);
			siyu.shangji("路人丙", "345", 5);
			siyu.shangji("路人丁", "456", 20);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	

}

  

package com.gf.conn013;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class Wangmin implements Delayed {

	private String name;

	private String id;

	private long endTime;

	private TimeUnit timeUnit = TimeUnit.SECONDS;

	public Wangmin(String name, String id, long endTime) {
		this.name = name;
		this.id = id;
		this.endTime = endTime;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public long getEndTime() {
		return endTime;
	}

	public void setEndTime(long endTime) {
		this.endTime = endTime;
	}

	public TimeUnit getTimeUnit() {
		return timeUnit;
	}

	public void setTimeUnit(TimeUnit timeUnit) {
		this.timeUnit = timeUnit;
	}

	@Override
	public long getDelay(TimeUnit unit) {
		
		return endTime - System.currentTimeMillis();
	}
	
	@Override
	public int compareTo(Delayed delayed) {
		
		Wangmin w = (Wangmin) delayed;
		
		return this.getDelay(this.timeUnit) - w.getDelay(this.timeUnit) > 0 ? 1:0;
	}


}

 

关注我的公众号,精彩内容不能错过

posted @ 2017-12-14 15:58  程序员果果  阅读(260)  评论(0编辑  收藏  举报