zoukankan      html  css  js  c++  java
  • DelayQueue使用示例之KTV包厢记时

    在学习Java 多线程并发开发过程中,了解到DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。

    Delayed,一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。

    在网上看到了一些示例,发现有的示例存在一些问题,做了些修改,希望能帮助大家理解。

    中国人都喜欢K歌,大部分人的内心都住着一个歌手的梦,尤其是学生时代,大家都喜欢组团去KTV唱歌,一唱一下午,大家都唱得很爽。话说又到了一年一度的双11,许多的单身狗开始组团来到KTV唱歌。那么KTV这个时候如何通过程序来收费记时的呢,模拟的代码如下:

    public class KTV implements Runnable{
        private DelayQueue<KTVConsumer> queue = new DelayQueue<>();
    
        public void begin(String name,String boxNum,int money){
    
            KTVConsumer man = new KTVConsumer(name,boxNum,20l*money+System.currentTimeMillis());
            System.out.println(man.getName()+" 等人交了"+money+"元钱,进入"+man.getBoxNum()+"号包厢,开始K歌...");
            this.queue.add(man);
        }
    
        public void end(KTVConsumer man){
            System.out.println(man.getName()+" 等人所在的"+man.getBoxNum()+"号包厢,时间到...");
        }
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while(true){
                try {
                    KTVConsumer man = queue.take();
                    end(man);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String args[]){
            try{
                System.out.println("KTV正常营业");
                System.out.println("================================");
                KTV  ktv = new KTV();
                Thread sing = new Thread(ktv);
                sing.start();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        ktv.begin("张三", "111", 500);
                    }
                }).start();
    
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        ktv.begin("李四", "666", 200);
                    }
                }).start();
    
                Thread.sleep(2000);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        ktv.begin("王五", "888", 100);
                        System.out.println("================================");
                    }
                }).start();
    
            }
            catch(Exception ex){
    
            }
    
        }
    }
    public class KTVConsumer implements Delayed{
        private String name;
        //截止时间
        private long endTime;
        //包厢号
        private String boxNum;
    
        public KTVConsumer(String name,String boxNum,long endTime){
            this.name=name;
            this.boxNum=boxNum;
            this.endTime=endTime;
        }
    
        public String getName(){
            return this.name;
        }
    
        public String getBoxNum(){
            return this.boxNum;
        }
    
        /**
         * 用来判断是否到了截止时间
         */
        @Override
        public long getDelay(TimeUnit unit) {
            // TODO Auto-generated method stub
            return unit.convert(endTime - System.currentTimeMillis(),  TimeUnit.MILLISECONDS);
        }
    
        /**
         * 相互比较排序用
         */
        @Override
        public int compareTo(Delayed o) {
            // TODO Auto-generated method stub
            if(o == null || ! (o instanceof KTVConsumer)) return 1;
            if(o == this) return 0;
            KTVConsumer s = (KTVConsumer)o;
            return endTime - s.endTime > 0 ? 1 :(endTime - s.endTime == 0 ? 0 : -1);
        }
    }

    运行的结果如下:

    KTV正常营业
    ================================
    张三 等人交了500元钱,进入111号包厢,开始K歌...
    李四 等人交了200元钱,进入666号包厢,开始K歌...
    王五 等人交了100元钱,进入888号包厢,开始K歌...
    ================================
    李四 等人所在的666号包厢,时间到...
    王五 等人所在的888号包厢,时间到...
    张三 等人所在的111号包厢,时间到...
  • 相关阅读:
    ASP.NET Post方式提交
    MVC增加操作日志
    asp.net MVC 下拉多级联动及编辑
    redis基本数据类型之String
    关于idea下使用springinitializr创建项目时 初始化失败的解决
    Failed to read artifact descriptor for org.mybatis:mybatis:jar:2.2.1
    如何查看日志文件
    nginx 部署vue 以及同一端口下部署监听多个vue 项目
    JsonView 与JsonIgnore 使用
    vue 打包部署
  • 原文地址:https://www.cnblogs.com/WangHaiMing/p/7550601.html
Copyright © 2011-2022 走看看