• 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;
    	}
    
    
    }
    

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

  • 相关阅读:
    从零开始学习内网渗透之域环境的搭建
    ssrf漏洞学习(PHP)
    自己写的Weblogic的poc
    某CTF平台一道PHP代码审计
    某CTF平台一道PHP代码注入
    从xxe-lab来深入学习xxe漏洞
    Git常用命令
    一个简单的基于MINI2440开发板的启动代码
    面试题
    Linux多线程及线程同步简单实例
  • 原文地址:https://www.cnblogs.com/huanchupkblog/p/8038198.html
Copyright © 2020-2023  润新知