在学习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号包厢,时间到...

DelayQueue使用示例之KTV包厢记时的更多相关文章

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

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

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

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

  3. Mybatis 示例之 Association - 偶尔记一下 - 博客频道 - CSDN.NET

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  4. JavaScript BOM 遗漏知识再整理;弹窗和记时事件;

    1.JavaScript 弹窗 警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. window.alert() 方法可以不带上window对象, ...

  5. js到记时代码

    原文地址:http://www.w3school.com.cn/tiy/t.asp?f=hdom_timing_infinite html><head><script type ...

  6. 记时,耗时,Stopwatch

    public static string InvokeStopwatch(Action function) { System.Diagnostics.Stopwatch sw = new System ...

  7. java并发之DelayQueue实际运用示例

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

  8. java 之DelayQueue实际运用示例

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

  9. Swift-CALayer十则示例

    作者:Scott Gardner   译者:TurtleFromMars原文:CALayer in iOS with Swift: 10 Examples 如你所知,我们在iOS应用中看到的都是视图( ...

随机推荐

  1. hr用法

    定义和用法 <hr> 标签在 HTML 页面中创建一条水平线. 水平分隔线(horizontal rule)可以在视觉上将文档分隔成各个部分. HTML 与 XHTML 之间的差异 在 H ...

  2. jenkins 每个月1号到7号 一天执行一次

    在线Crontab表达式执行时间验证 / crontab执行时间计算 - aTool在线工具验证 http://www.atool.org/crontab.php 1.Build periodic a ...

  3. ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界

    HttpContext是ASP.NET中的核心对象,每一个请求都会创建一个对应的HttpContext对象,我们的应用程序便是通过HttpContext对象来获取请求信息,最终生成响应,写回到Http ...

  4. Mysql分页处理(PageHelper)

    第一次做分页处理(完全不知道分页处理到底要做成什么样?) 理解:其实就是前台页面通过传递不同的参数{1.查询的条件.2.查询页数(pageNum),3每页展现的条数(pageSize)},之后我们(只 ...

  5. input长度随输入内容动态变化 input光标定位在最右侧

    <input type="text" onkeydown="this.onkeyup();" onkeyup="this.size=(this. ...

  6. spring 整合Mybatis 《报错集合,总结更新》

    错误:java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldExcepti ...

  7. CPU和GPU的差别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt317 首先需要解释CPU和GPU这两个缩写分别代表什么.CPU即中央处理器, ...

  8. dubbo+zookeeper伪集群配置

    zookeeper作为注册中心,服务器和客户端都要访问,如果有大量的并发,肯定会有等待.所以可以通过zookeeper集群解决. 一.为什么需要zookeeper呢? 大部分分布式应用需要一个主控.协 ...

  9. JTemplates + $.Ajax

    上篇基础使用后: +AJAX 只需要改列名即可 :<script type="text/template" id="foreach">   里的循环 ...

  10. nrm的安装 、定义和用法

    因为npm包管理工具是属于国外的,所以在中国使用它下载东西的时候比较慢.这时我们就想用国内的淘宝镜像.也有别的,所以当你想切换下载源的时候就会用到nrm了. ###首先,nrm是什么呢? 开发的npm ...