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号包厢,时间到...
DelayQueue使用示例之KTV包厢记时的更多相关文章
- 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. 后台服务.保 ...
- Mybatis 示例之 Association - 偶尔记一下 - 博客频道 - CSDN.NET
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- JavaScript BOM 遗漏知识再整理;弹窗和记时事件;
1.JavaScript 弹窗 警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. window.alert() 方法可以不带上window对象, ...
- js到记时代码
原文地址:http://www.w3school.com.cn/tiy/t.asp?f=hdom_timing_infinite html><head><script type ...
- 记时,耗时,Stopwatch
public static string InvokeStopwatch(Action function) { System.Diagnostics.Stopwatch sw = new System ...
- java并发之DelayQueue实际运用示例
在学习Java 多线程并发开发过程中,了解到DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走. ...
- java 之DelayQueue实际运用示例
在学习Java 多线程并发开发过程中,了解到DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走. ...
- Swift-CALayer十则示例
作者:Scott Gardner 译者:TurtleFromMars原文:CALayer in iOS with Swift: 10 Examples 如你所知,我们在iOS应用中看到的都是视图( ...
随机推荐
- yum和apt-get的区别
一般来说著名的linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的 ...
- windows 10 安装tensorflow
人工智能一浪接一浪,随着谷歌公布tensorflow源码,尤其是支持windows 10平台的python3.5以上版本,更是让更多人都想用windows操作tensorflow. 第一次安装,也不知 ...
- mysql存储过程查询结果循环遍历 判断 赋值 游标等基本操作
一.首先说下本篇博客所实现功能的背景和功能是怎样的: 背景:因为公司项目开始迁移新平台项目,所以以前的平台老数据以及订单信息需要拆分表,而且需要业务逻辑来分析以前的订单表,来拆分成另外的几个新表,包括 ...
- R语言安装加载包
问题描述 在国内因为镜像的原因,直接使用:install.packages("plyr")往往无法成功添加安装包 解决办法 使用国内镜像进行安装,添加repo参数,参考如下: in ...
- WEB版一次选择多个文件进行批量上传(WebUploader)的解决方案
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- linux系统安装配置exim4(源码安装)
一.Exim4概述 Exim是一个MTA(Mail Transfer Agent,邮件传输代理)服务器软件,该软件基于GPL协议开发,是一款开源软件.该软件主要运行于类UNIX系统.通常该软件会与Do ...
- Struts2使用小问题-NoSuchFieldException
五月 12, 2017 4:55:14 下午 com.opensymphony.xwork2.util.logging.jdk.JdkLogger warn 警告: couldn't clear to ...
- Eclipse关闭项目
Eclipse 关闭项目 为什么要关闭项目? Eclipse 工作空间包含了多个项目.一个项目可以是关闭或开启状态. 项目打开过多影响有: 消耗内存 占用编译时间:在删除项目.class 文件(Cle ...
- 正则表达式 提取<A>标签
功能用途 主要实现了提取html代码中的a标签和url地址. 示例代码 Regex regex = new Regex("href\\s*=\\s*(?:\"(?<1> ...
- Java8 Stream简介
Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响. lambd ...