在学习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()+"号包厢,时间到...");}@Overridepublic void run() {// TODO Auto-generated method stubwhile(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() {@Overridepublic void run() {ktv.begin("张三", "111", 500);}}).start();new Thread(new Runnable() {@Overridepublic void run() {ktv.begin("李四", "666", 200);}}).start();Thread.sleep(2000);new Thread(new Runnable() {@Overridepublic 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;}/*** 用来判断是否到了截止时间*/@Overridepublic long getDelay(TimeUnit unit) {// TODO Auto-generated method stubreturn unit.convert(endTime - System.currentTimeMillis(),  TimeUnit.MILLISECONDS);}/*** 相互比较排序用*/@Overridepublic int compareTo(Delayed o) {// TODO Auto-generated method stubif(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号包厢,时间到...

转载于:https://www.cnblogs.com/WangHaiMing/p/7550601.html

DelayQueue使用示例之KTV包厢记时相关推荐

  1. Atitit.播放系统的选片服务器,包厢记时系统 的说明,教程,维护,故障排查手册p825...

    Atitit.播放系统的选片服务器,包厢记时系统 的说明,教程,维护,故障排查手册p825 1. 播放系统服务器方面的维护 2 1.1. 默认情况下,已经在系统的启动目录下增加了俩个启动项目 2 1. ...

  2. Atitit. 包厢记时系统 的说明,教程,维护,故障排查手册v2 pb25.doc

    Atitit. 包厢记时系统 的说明,教程,维护,故障排查手册v2 pb25.doc 1. 服务器方面的维护1 1.1. 默认情况下,已经在系统的启动目录下增加了 个启动项目1 1.2. 后台服务.保 ...

  3. DelayQueue使用示例

    在学习Java 多线程并发开发过程中,了解到DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走. ...

  4. 手机验证码倒记时函数

    /*** 倒记时* @param {object} options 设置参数* @param.fresh_text {string} 倒计时结束要显示的文字,默认使用按钮最初的文字* @param.c ...

  5. 电脑记时----千年虫

    2019独角兽企业重金招聘Python工程师标准>>> 俗话说,山中无甲子,寒暑不知年.这讲的是记时对人类的重要性.时间对于计算机来说,尤为重要.首先,它是计算机活动的心脏,提供系统 ...

  6. javaSE (十六)Randon、System类的方法(生成随机数、主动垃圾回收、终止jvm、对程序进行记时、System自带的复制数组的方法)

    生成0到100之间的伪随机数 主动运行垃圾回收器,相当于呼喊保洁阿姨 非0就是异常终止jvm 对程序进行记时 System自带的复制数组的方法 1. 生成0到100之间的伪随机数2. 运行垃圾回收器, ...

  7. 在线秒表 - 在线计时器 - 在线记时器

    在线秒表 - 在线计时器 - 在线记时器 https://www.online-stopwatch.com/ https://www.online-stopwatch.com/chinese/ 1. ...

  8. 仿热血江湖帮战客方血帮战 准备记时器结束事件

    public void timer_0_Elapsed(object sender, ElapsedEventArgs e)         {             if (GClass4.int ...

  9. 倒计算程序php,ASP_用ASP实现距指定日期的倒记时程序源码,给一个特殊的日子设计一个倒 - phpStudy...

    用ASP实现距指定日期的倒记时程序源码 给一个特殊的日子设计一个倒记时,也挺有意思的,而且利用几个时间函数,就可简单地完成ASP网页中距某个时间点的倒记时功能,改变Cdate函数的参数就可完成其他日期 ...

最新文章

  1. Docker的安装和使用及其Docker容器间通信,云计算技术与应用实验报告
  2. Hivr:基于BCH的社交应用
  3. 基于SSM实现校园失物招领系统
  4. oracle单行超2499,SP2-0027: Input is too long ( 2499 characters) - line ignored — oracle-tech
  5. 第8章 SQL语言(一)
  6. Delphi XE中String、ANSIString、TBytes之间的转换
  7. ssh 使用公钥登录客户端设置
  8. 计算机无法获取正常的ip地址,教你轻松解决Win7系统经常获取不到IP地址问题
  9. 百词斩不复习_有人用过百词斩和不背单词两款背单词app吗?良心推荐哪一个好一点?...
  10. Ubuntu快速下载电驴ed2k文件
  11. c语言字符画小狗,C语言字符画,字符闪画
  12. oracle bbed 推进scn
  13. SPI Flash芯片W25Q32英文版数据手册解读(一)---------引脚功能,工作模式
  14. Python style百分制转五分制
  15. 淘宝店到底哪些数据值得我们去分析?
  16. 第十七届全国大学生智能车竞赛山东赛区比赛成绩
  17. 中文文本校对源码java_浅谈中文文本自动纠错在影视剧搜索中应用与Java实现
  18. ide编辑器 android,从 IDE 到终端 + 文本编辑器
  19. GPU cudaMallocManaged 统一内存的优劣点
  20. 中国人民公安大学计算机考研,中国人民公安大学考研难吗?

热门文章

  1. 交通事故预测——《RiskOracle: A Minute-level Citywide Traffic Accident Forecasting Framework》
  2. 关闭Pinterest通知
  3. java json去掉反斜杠,如何去掉Json字符串中反斜杠
  4. Silverlight杂记Media和SMF播放控件推荐
  5. 微信小程序 给数字或文字加横线,比如原价、已完成任务
  6. Metaverse 元宇宙入门-09-不断发展的用户 + 商业行为和元界
  7. C++17之std::visit
  8. mysql on cascade_MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE
  9. macbook pro的漏电
  10. 100个优秀实用性网站