一、延迟队列

延迟队列,底层依赖了优先级队列PriorityBlockingQueue

二、延迟队列案例

(1)延迟队列的任务

public class DelayTask implements Delayed {

    /**
* 要执行的任务
*/
private String doTask; /**
* 任务要执行的时间
*/
private Date date; /**
* 还剩多长时间,开始执行任务
* @param unit
* @return
*/
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(date.getTime()-System.currentTimeMillis(),unit) ;
} /**
* 当前对象,跟其他延时任务比,谁更先被触发
* @param o
* @return
*/
@Override
public int compareTo(Delayed o) {
if(o instanceof DelayTask){
Date otherDate= ((DelayTask) o).getDate();
long a= date.getTime()-otherDate.getTime();
if(a>0){
return 1;
}else if(a<0){
return -1;
}else{
return 0;
}
}else{
throw new RuntimeException("队列数据异常");
}
} public String getDoTask() {
return doTask;
} public void setDoTask(String doTask) {
this.doTask = doTask;
} public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
}
}

(2)延迟队列的消费线程

public class DelayTaskThread extends Thread{

private DelayQueue<DelayTask> delayTasksQueue;

public DelayTaskThread(DelayQueue<DelayTask> delayTasksQueue ){
this.delayTasksQueue=delayTasksQueue;
} @Override
public void run() {
System.out.println("===========线程开始运行=====");
while (true){
try {
DelayTask delayTask=delayTasksQueue.take();
System.out.println(DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"获取任务成功");
Date date =delayTask.getDate();
String task=delayTask.getDoTask();
System.out.println(DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"=====>要执行的任务内容为【"+task+"】到期时间为【"+ DateFormatUtils.format(date,"yyyy-MM-dd HH:mm:ss")+"】");
Arrays.asList("a","b");
} catch (InterruptedException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
}
}

【java多线程】队列系统之DelayQueue源码的更多相关文章

  1. Java中常用的七个阻塞队列第二篇DelayQueue源码介绍

    Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...

  2. Java并发包源码学习系列:阻塞队列实现之DelayQueue源码解析

    目录 DelayQueue概述 类图及重要字段 Delayed接口 Delayed元素案例 构造器 put take first = null 有什么用 总结 参考阅读 系列传送门: Java并发包源 ...

  3. 【java多线程】队列系统之LinkedBlockingQueue源码

    转载:https://blog.csdn.net/tonywu1992/article/details/83419448 http://benjaminwhx.com/archives/ 1.简介 上 ...

  4. 【java多线程】队列系统之LinkedBlockingDeque源码

    1.简介 上一篇我们介绍了 LinkedBlockingDeque 的兄弟篇 LinkedBlockingQueue .听名字也知道一个实现了 Queue 接口,一个实现了 Deque 接口,由于 D ...

  5. 【java多线程】队列系统之ArrayBlockingQueue源码

    1.简介 ArrayBlockingQueue,顾名思义:基于数组的阻塞队列.数组是要指定长度的,所以使用ArrayBlockingQueue时必须指定长度,也就是它是一个有界队列. 它实现了Bloc ...

  6. lesson2:java阻塞队列的demo及源码分析

    本文向大家展示了java阻塞队列的使用场景.源码分析及特定场景下的使用方式.java的阻塞队列是jdk1.5之后在并发包中提供的一组队列,主要的使用场景是在需要使用生产者消费者模式时,用户不必再通过多 ...

  7. Java多线程学习之线程池源码详解

    0.使用线程池的必要性 在生产环境中,如果为每个任务分配一个线程,会造成许多问题: 线程生命周期的开销非常高.线程的创建和销毁都要付出代价.比如,线程的创建需要时间,延迟处理请求.如果请求的到达率非常 ...

  8. 【java多线程】队列系统之PriorityBlockingQueue源码

    一.二叉堆 如题,二叉堆是一种基础数据结构 事实上支持的操作也是挺有限的(相对于其他数据结构而言),也就插入,查询,删除这一类 对了这篇文章中讲到的堆都是二叉堆,而不是斜堆,左偏树,斐波那契堆什么的  ...

  9. Java在线考试系统(含源码)

    本文demo下载和视频教学观看地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1076 本实例介绍了在线考 ...

随机推荐

  1. 51Nod - 1384 正常解法

    这个是正常解法 #include<stdio.h> #include<string.h> #include<math.h> #include<time.h&g ...

  2. Angular 学习笔记 (组件沟通的思考)

    组件指令间经常需要沟通 我们知道的方式有 input output service inject viewchild contentchild templateRef template variabl ...

  3. 用GraphX分析伴生网络(二)

    8. 过滤噪声边 在当前的伴生关系中,边的权重是基于一对概念同时出现在一篇论文中的频率来计算的.这种简单的权重机制的问题在于:它并没有对一对概念同时出现的原因加以区分,有时一对概念同时出现是由于它们具 ...

  4. 深入理解Plasma(一)Plasma 框架

    这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等.本篇文章作为开篇,主要目的是理解 Plasma 框架. Plasma 作为以太坊的二层扩容框架, ...

  5. 使用Metasploit渗透攻击windows系统(二)

    后渗透攻击: 介绍常用的一些命令: 查看进程:ps 查看当前进程号:getpid 查看系统信息:sysinfo 查看目标机是否为虚拟机:run post/windows/gather/checkvm ...

  6. append、appendTo、prepend、prependTo、before、insertBefore、after、insertAfter、replaceAll方法被调用后,原本在页面上显示的元素会消失

    详细描述: $ele.append..appendTo..prepend..prependTo..before..insertBefore..after..insertAfter..replaceAl ...

  7. Java中Annotation用法

    其他还可以参考的地址 https://www.cnblogs.com/skywang12345/p/3344137.html Annotation Annotation其实是代码里的特殊标记,这些标记 ...

  8. day 01 python基础

    1.计算机历史 2.python历史 宏观: python2和python3的区别: python2  源码不标准,混乱,重复代码过多 python3  统一标准,去除重复代码 3.python环境 ...

  9. input输入框只能输入正整数

    <input type="text" value="1" onkeyup="if(this.value.length==1){this.valu ...

  10. zabbix3.4.7官方解释触发器

    函数   描述 参数 说明 abschange   最近获取值与之前获取值差的绝对值.   支持值的类型: float, int, str, text, log 例如: (最近获取值;之前获取值=ab ...