14.DelayQueue

  1. 带有延迟时间的queue,其中的元素只有当它指定的延迟时间到了,才能从队列中获取该指定的元素,DelayQueue中的元素必须实现Delayed接口,它是一个没有大小限制的队列,应用场景比较多,比如缓存超时的数据移除,任务超时处理,空闲连接关闭等。
  2.  
  3. public class Wangmin implements Delayed { 
  4.    
  5.     private String name
  6.     //身份证 
  7.     private String id
  8.     //截止时间 
  9.     private long endTime
  10.     //定义时间工具类
  11.     private TimeUnit timeUnit = TimeUnit.SECONDS;
  12.      
  13.     public Wangmin(String name,String id,long endTime){ 
  14.         this.name=name
  15.         this.id=id
  16.         this.endTime = endTime
  17.     } 
  18.      
  19.     public String getName(){ 
  20.         return this.name
  21.     } 
  22.      
  23.     public String getId(){ 
  24.         return this.id
  25.     } 
  26.      
  27.     /**
  28.      * 用来判断是否到了截止时间
  29.      */ 
  30.     @Override 
  31.     public long getDelay(TimeUnit unit) {
  32.         //return unit.convert(endTime, TimeUnit.MILLISECONDS) - unit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
  33.        return endTime - System.currentTimeMillis();
  34.     } 
  35.  
  36.     /**
  37.      * 相互批较排序用
  38.      */ 
  39.     @Override 
  40.     public int compareTo(Delayed delayed) { 
  41.        Wangmin w = (Wangmin)delayed
  42.         return this.getDelay(this.timeUnit) - w.getDelay(this.timeUnit) > 0 ? 1:0; 
  43.     } 
  44.    
  45.  
  46. public class WangBa implements Runnable { 
  47.    
  48.     private DelayQueue queue = new DelayQueue(); 
  49.    
  50.     public boolean yinye =true
  51.      
  52.     public void shangji(String name,String id,int money){ 
  53.         Wangmin man = new Wangmin(name, id, 1000 * money + System.currentTimeMillis()); 
  54.         System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"交钱"+money+",开始上机..."); 
  55.         this.queue.add(man); 
  56.     } 
  57.      
  58.     public void xiaji(Wangmin man){ 
  59.         System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"时间到下机..."); 
  60.     } 
  61.  
  62.     @Override 
  63.     public void run() { 
  64.         while(yinye){ 
  65.             try
  66.                 Wangmin man = queue.take(); 
  67.                 xiaji(man); 
  68.             } catch (InterruptedException e) { 
  69.                 e.printStackTrace(); 
  70.             } 
  71.         } 
  72.     } 
  73.      
  74.     public static void main(String args[]){ 
  75.         try
  76.             System.out.println("网吧开始营业"); 
  77.             WangBa siyu = new WangBa(); 
  78.             Thread shangwang = new Thread(siyu); 
  79.             shangwang.start(); 
  80.              
  81.             siyu.shangji("路人甲", "123", 1); 
  82.             siyu.shangji("路人乙", "234", 10); 
  83.             siyu.shangji("路人丙", "345", 5); 
  84.         } 
  85.         catch(Exception e){ 
  86.             e.printStackTrace();
  87.         } 
  88.  
  89.     } 
  90. 输出结果:
  91. 网吧开始营业
  92. 网名路人甲 身份证123交钱1,开始上机...
  93. 网名路人乙 身份证234交钱10,开始上机...
  94. 网名路人丙 身份证345交钱5,开始上机...
  95. 网名路人甲 身份证123时间到下机...
  96. 网名路人丙 身份证345时间到下机...
  97. 网名路人乙 身份证234时间到下机...
  98.  
  99.  

你可能感兴趣的:(多线程)