java延时队列 示例


/**
* @desc: java 延时队列 思路:使用java.util.concurrent.DelayQueue队列,
* 队列的元素需要实现Delayed接口的getDelay()和compareTo()两个方法
* @author: 毛会懂
* @create: 2022-02-08 17:20:00
**/
public class Test44Main {
public static void main(String[] args) throws IOException {

// 延迟队列
DelayQueue queue = new DelayQueue<>();

// 线程1: 生产者 每隔2S产生一个对象
CompletableFuture.runAsync(()->{
System.out.println("启动生产者了");
for(int i = 5; i < 30;i+=5){
System.out.println("放入队列" + i);
Obj temp = new Obj(i,TimeUnit.SECONDS,"name_" + i);
queue.put(temp);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

// 线程2: 消费者
CompletableFuture.runAsync(() ->{
System.out.println("启动消费者了");
while (true){
try {
Obj take = queue.take();
System.out.format("name={%s},time={%s},当前时间={%s} \n",take.name,take.time, LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
System.out.println("主线程结束");
System.in.read();
}


/**
* @desc : 消费的对象需要实现Delayed接口的getDelay()和 compareTo()
* @author : 毛会懂
* @create: 2022/2/8 17:23:00
**/
public static class Obj implements Delayed {
private long time;
private String name;

public Obj(long time,TimeUnit unit,String name){
this.time = System.currentTimeMillis() + (time > 0 ? unit.toMillis(time) : 0);
this.name = name;
}

@Override
public long getDelay(TimeUnit unit) {
// return time;
return time - System.currentTimeMillis();
}

@Override
public int compareTo(Delayed o) {
Obj obj = (Obj)o;
long diff = this.time - obj.time ;
if(diff > 0){
return 1;
}else if (diff < 0){
return -1;
}
return 0;
}

@Override
public String toString() {
return "本对象的time=" + time + "name=" + name;
}
}

}

Original: https://www.cnblogs.com/maohuidong/p/15872269.html
Author: 毛会懂
Title: java延时队列 示例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538599/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JavaFX Metro UI 和 开发库

    这是一个Windows设计风格的UI库,使用非常简单,只要一行代码就可以实现整体UI风格的替换! <span class="hljs-selector-tag&qu…

    Java 2023年6月9日
    060
  • 子程序(一个方法)中出现多个返回语句

    子程序中不建议出现过多的返回语句,尽量减少子程序返回语句的数量。 Original: https://www.cnblogs.com/txzn/p/16600520.htmlAut…

    Java 2023年6月5日
    068
  • java 实体类命名规则

    1,PO(Persistent Object) 持久层对象,它是由一组属性和属性的get和set方法组成,最简单的 PO 就是对应数据库中某个表中的一条记录(也就是说,我们可以将数…

    Java 2023年5月29日
    092
  • 开发必备之单元测试

    祸乱生于疏忽 单元测试先于交付。穿越暂时黑暗的时光隧道,才能迎来系统的曙光。 单元测试的相关介绍 ​ 计算机世界里的软件产品通常是由模块组合而成的 模块又可以分成诸多子模块。 比如…

    Java 2023年6月5日
    064
  • Java8新特性-方法引用

    方法引用的使用场景 我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下…

    Java 2023年6月8日
    068
  • 从零开始自己动手写自旋锁

    我们在写并发程序的时候,一个非常常见的需求就是保证在某一个时刻只有一个线程执行某段代码,像这种代码叫做临界区,而通常保证一个时刻只有一个线程执行临界区的代码的方法就是锁🔒。在本篇文…

    Java 2023年6月8日
    077
  • Spring框架下的 “接口调用、MVC请求” 调用参数、返回值、耗时信息输出

    主要拦截前端或后天的请求,打印请求方法参数、返回值、耗时、异常的日志。方便开发调试,能很快定位到问题出现在哪个方法中。 前端请求拦截,mvc的拦截器 1 import java.u…

    Java 2023年5月30日
    085
  • JDK8下载安装及环境配置

    Java基础知识 Java的三种版本 JavaSE :标准版,主要用于开发桌面程序,控制台开发等等 JavaME:嵌入式开发,主要用于开发手机,小家电等等,目前使用的比较少 Jav…

    Java 2023年6月7日
    065
  • win10下计算文件哈希值的方法

    cmd下使用certutil命令 使用方法: certutil -hashfile FILE_NAME ALGORITHM_NAME 支持的加密算法包括:MD2,MD4,MD5,S…

    Java 2023年6月9日
    097
  • npm 添加淘宝代理

    设置仓库npm config set registry https:# 查看代理结果npm config get registry# 解除网络代理npm config set pr…

    Java 2023年6月13日
    0110
  • pyton对Quoted-printable进行编码和解码

    前言 利用的是python的 quopri模块进行操作 一.加密 import quopri str = "你好世界" a = quopri.encodestr…

    Java 2023年6月13日
    093
  • spring boot集成solr-SpringBoot(26)

    了解Solr Solr是一个独立的企业级搜索应用服务器,对外提供API接口。用户可以通过HTTP请求向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过HTTP GET操…

    Java 2023年6月13日
    075
  • Lambda表达式

    1.常见单方法接口 Comparator Runnable Callable @FunctionalInterface 只定义了单方法的接口称之为 FunctionalInterf…

    Java 2023年6月13日
    090
  • @FeignClient常用属性

    @FeignClient(name = "gateway-test", value = "gateway-test", url = &quo…

    Java 2023年6月5日
    080
  • 一条 SQL 语句是如何执行的

    一条 SQL 语句是如何执行的 SQL查询语句 select * from user where ID=10; MySQL 的基本架构可以分为 Server 层和存储引擎两部分。S…

    Java 2023年6月8日
    070
  • 【转】认识长轮询:配置中心是如何实现推送的?

    一 前言 传统的静态配置方式想要修改某个配置时,必须重新启动一次应用,如果是数据库连接串的变更,那可能还容易接受一些,但如果变更的是一些运行时实时感知的配置,如某个功能项的开关,重…

    Java 2023年6月7日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球