DelayQueue怎么在Java多线程并发开发中使用

发布时间:2020-12-05 17:29:31

来源:亿速云

阅读:56

作者:Leah

这篇文章给大家介绍DelayQueue怎么在Java多线程并发开发中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

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

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

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

public class KTV implements Runnable{

private DelayQueue 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怎么在Java多线程并发开发中使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

delay在java中有什么用_DelayQueue怎么在Java多线程并发开发中使用相关推荐

  1. 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(十五)——JSP基础语法   任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语

    javaweb学习总结(十五)--JSP基础语法 任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. ...

  2. java关于Timer schedule执行定时任务 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等...

    1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Time ...

  3. java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...

  4. java语言使用的字符码集是_Java应用开发中的字符集与字符编码

    事出有因 在向HttpURLConnection的输出流写入内容时,因没有设置charset,导致接收方对数据的验签不一致. URL url = newURL(requestUrl);//打开连接 H ...

  5. java 模拟多线程并发_Java中模拟同时并发请求

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

  6. java线程池拒绝策略_Java核心知识 多线程并发 线程池原理(二十三)

    线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行.他 ...

  7. java sqlite 多线程并发_Android中Sqlite数据库多线程并发问题

    最近在做一个Android项目, 为了改善用户体验,把原先必须让用户"等待"的过程改成在新线程中异步执行.但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败. ...

  8. JAVA社交平台项目第七天 JUC多线程

    JUC多线程 (一) 学习目标: 掌握多线程的创建 掌握线程安全的处理 了解线程状态 掌握线程停止的两种方法 了解线程的原子性,可见性和有序性 理解内存可见性的原理 掌握synchronized解决内 ...

  9. Java 中有三大支柱

    在 Java 中除了最为基础的东西之外,你只要看三样东西就可以了: Java 中有三大支柱,在 java.util.concurrent.java.security.javax.cropty.java ...

最新文章

  1. perl 登录linux服务器,用Perl管理Linux操作系统的配置文件
  2. Tungsten Fabric SDN — DCI
  3. linux shell 脚本练习,shell脚本小练习
  4. 金融系列4《基本指令》
  5. python对XML的解析
  6. Spring MVC测试框架入门–第2部分
  7. 搭建LNMP遇到的问题
  8. RabbitMQ消息队列简单异步邮件发送和订单异步处理实战【应用解耦】【异步削峰】
  9. 一起学习C语言:初步进入编程世界(二)
  10. html 静态网页如何在手机上访问,anywhere,http-server
  11. 关于win10 pagefile.sys文件的解读及占用C盘空间太大的处理
  12. 四,AXI总线协议解析
  13. 关于DDoS攻击的8个误区
  14. 南京南汽技工学校计算机专业是啥,计算机中心附近技术类学校
  15. 计算机打字键盘怎么控制,键盘不受控制怎么办?
  16. pands 画图 调整大小_关于数学建模的画图学习建议
  17. python代码图片头像_python图像处理-个性化头像
  18. 规划xr871实现儿童故事机的基本功能
  19. Vue中定制公共组件之modal
  20. 开机报错“部分便笺的元数据已被损坏” 解决方法 win7

热门文章

  1. linux 移动硬盘 mnt,linux 移动硬盘 mnt
  2. 【MySQL】基于MySQL的SQL核心语法实战演练(二)
  3. 不连续字符的串计数(洛谷P4439题题解,Java语言描述)
  4. Cacti0.8.8a监控mysql
  5. 百度云 网盘无法下载,错误提示:MSXML组件版本太低
  6. 实现textarea限制输入字数
  7. Id vs Instancetype
  8. C语言文件打开方式及说明
  9. 程序员找工作时,大公司 VS 小公司,应该如何做出正确的选择?
  10. 程序员结婚晚回家怕出轨吗?老婆:不怕,老公是写代码的,忙得很!