DelayQueue是一个延迟队列,插入队列的数据只有达到设置的延迟时间时才能被取出,否则线程会被阻塞。插入队列的对象必须实现Delayed接口,实现comapreTo方法和getDelay方法,其中getDelay方法用于设置对象延迟多少秒取出,compareTo用于对被延迟取出的数据进行排序,所以compareTo方法中一般调用对象的getDelay方法,根据对象的延迟时间进行排序。

首先是定义实现Delayed接口的类:

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/*** 实现Delayed接口,用于插入延迟阻塞队列* @author SN**/
public class Worker implements Delayed{private String name;private String workNo;private long startTime;private long endTime;public static final TimeUnit TIME_UNIT=TimeUnit.SECONDS;public Worker(String name,String workNo,long startTime,long endTime){this.name=name;this.workNo=workNo;this.startTime=startTime;this.endTime=endTime;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getWorkNo() {return workNo;}public void setWorkNo(String workNo) {this.workNo = workNo;}public long getStartTime() {return startTime;}public void setStartTime(long startTime) {this.startTime = startTime;}public long getEndTime() {return endTime;}public void setEndTime(long endTime) {this.endTime = endTime;}//排序方法,用于将插入队列的对象按延迟时间进行排序@Overridepublic int compareTo(Delayed delayed) {Worker worker=(Worker) delayed;return (this.getDelay(TIME_UNIT)-worker.getDelay(TIME_UNIT))>0?1:0;}//延迟时间,用于确定取出队列中数据的时间@Overridepublic long getDelay(TimeUnit unit) {return endTime-System.currentTimeMillis();}}

然后是测试向DelayQueue插入数据和取出数据:

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.concurrent.DelayQueue;/*** 向延迟队列中插入数据,并在到达延迟时间时从队列中取出数据,否则就阻塞当前线程* @author SN**/
public class DelayQueueExp implements Runnable{private DelayQueue<Worker> queue=new DelayQueue<>();public boolean working=true;public static final SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//向延迟队列中插入数据,并设置延迟取出的时间public void startWork(String name,String workNo,int grade){long time=System.currentTimeMillis();Date date=new Date(time);Worker worker=new Worker(name, workNo, System.currentTimeMillis(), grade*10000+time);System.out.println("员工"+worker.getName()+",工号"+worker.getWorkNo()+"于"+sdf.format(date)+"打卡上班...");this.queue.add(worker);}public void endWork(Worker worker){Date date=new Date(worker.getEndTime());System.out.println("员工"+worker.getName()+",工号"+worker.getWorkNo()+"于"+sdf.format(date)+"打卡下班...");}@Overridepublic void run() {while (working) {try {//启动线程后,从延迟队列中取出数据,如果没有满足延迟时间条件的数据可以取出就阻塞住线程Worker worker=queue.take();endWork(worker);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {System.out.println("员工开始打卡上班...");DelayQueueExp company=new DelayQueueExp();Thread work=new Thread(company);work.start();//向延迟队列中插入数据company.startWork("zhangsan", "1001", 1);company.startWork("lisi", "1002", 3);company.startWork("wanger", "1003", 5);}
}

DelayQueue用例相关推荐

  1. 一个小兔子的大数据见解2

    Big Data 阿里的大数据解决方案 MAXCOMPUTE DATAWORKS QUICKBI 1.Vmware增强 2. 1.1.VMware 虚拟网络设备 1.1.1.虚拟网卡.虚拟交换机 虚拟 ...

  2. 《Java150道面试题全集》

    本文转载他人,自留作笔记用,请尊重原创作者. 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两 ...

  3. 从一个简单的Java单例示例谈谈并发

    一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static Un ...

  4. 面试官系统精讲Java源码及大厂真题 - 21 DelayQueue 源码解析

    21 DelayQueue 源码解析 引导语 之前我们说的阻塞队列,都是资源足够时立马执行.本章我们说的队列比较特殊,是一种延迟队列,意思是延迟执行,并且可以设置延迟多久之后执行,比如设置过 5 秒钟 ...

  5. java queue iterator_Java DelayQueue iterator()用法及代码示例

    DelayQueue的iterator()方法用于在DelayQueue中的所有元素上返回迭代器.这些元素可以过期或未过期. 用法: public Iterator iterator () 参数:此方 ...

  6. 【JAVA】延迟队列DelayQueue的应用

    最近在开发CRM管理系统时遇到一个需求:销售部门的人员在使用该系统时,可以从[线索公海]模块中 "领取" 潜在的客户线索到自己的[线索私海]模块中,成为自己私有的潜在客户线索,以便 ...

  7. 每天一例多线程[day14]----JDK并发包Queue队列

    队列简介 关于什么时候使用MQ消息队列,什么时候使用JAVA自带队列,有一些基本的原则,如下图: 生产者:生产消息的速度很慢,缓慢地放入MQ中存储. 消费者:消费能力强,快速处理掉MQ中的消息. 这种 ...

  8. Android 沾包处理,以串口接入为例 (usb-serial-for-android)

    1. 前言 我们在通过串口.TCP.UDP等方式接收协议的时候,由于单次接收数据有限,导致一条命令可能被分割成多次进行接收. 这种情况下,就需要进行沾包处理,使多次接收的数据,合并成一条数据.本文通过 ...

  9. YOLOv4 资源环境配置和测试样例效果

    YOLOv4 资源环境配置和测试样例效果 基本环境:cuda=10.0,cudnn>=7.0, opencv>=2.4 一.下载yolov4 git clone https://githu ...

  10. 2021年大数据常用语言Scala(三十二):scala高级用法 样例类

    目录 样例类 定义样例类 样例类方法 样例对象 样例类 样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类),而且它会自动生成apply方法,允许我们快速地创建样例 ...

最新文章

  1. ubantu14.04下固定ip的配置方法以及问题处理
  2. POI实现读写内容到word中
  3. sensor曝光量和曝光行的区别_拼多多新手商家怎样快速提高曝光量?
  4. HDFS的API操作-创建文件和文件夹
  5. KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听
  6. Linux、Windows、Mac下Docker的安装与使用
  7. 【数据库题型大总结】名词解释总结
  8. .ssh文件夹在哪里_【TOOLS】本地利用ssh远程连接服务器并启用远程服务器的jupyter lab并配置好anaconda的环境...
  9. 【Cf #503 C】Sergey's problem(有趣的构造)
  10. func_ext.php,fsockopen和pfsockopen函数替换
  11. BGP邻居建立及路由传递/解决BGP数据层面路由黑洞实验
  12. Python3的opencv环境搭建简易教程
  13. 中国移动计算机二面笔试题,中国移动笔试面试经验
  14. java项目开发经验总结,值得收藏!
  15. oc引导win方法_适配自己的OC引导一键生成Opencore Generation X使用指南
  16. 《数字货币与人民币国际化》读书笔记1
  17. uml点餐系统活动图_UML 活动图
  18. 模拟位置 定位 钉钉打卡 运动轨迹 MD
  19. 注意啦!使用“流量卡”别图便宜,小心被监控!
  20. EXCEL【数据处理之数据合并——字段合并】

热门文章

  1. chapter 1 JS简介,核心语法,变量
  2. 数值分析思考题 (钟尔杰版) 参考解答——第三章
  3. mysql读写分离如何保证数据同步_MySQL 主从同步 、 MySQL 读写分离
  4. mysql中key的用法_数据库中KEY的用法
  5. 关于Albedo贴图、颜色贴图、Metallic 贴图、Specular贴图、法线贴图、视差贴图、凹凸贴图、Height Map高度贴图、AO 贴图Occlusion 贴图、Emission 贴图等
  6. Tuxera2022Mac系统读写NTFS磁盘工具装机必备
  7. 路由交换复习选择题题库
  8. 【asm】汇编器yasm使用说明
  9. phpspider 简单使用
  10. 2022华为春招面试经历