Java利用DelayQueue实现延迟任务代码实例

 更新时间:2023年12月08日 10:39:56   作者:陳先森嗎  
这篇文章主要介绍了Java利用DelayQueue实现延迟任务代码实例,DelayQueue 是一个支持延时获取元素的阻塞队列, 内部采用优先队列 PriorityQueue 存储元素,同时元素必须实现 Delayed 接口,需要的朋友可以参考下

DelayQueue实现延迟任务

JDK自带DelayQueue 是一个支持延时获取元素的阻塞队列, 内部采用优先队列 PriorityQueue 存储元素,同时元素必须实现 Delayed 接口;

在创建元素时可以指定多久才可以从队列中获取当前元素,只有在延迟期满时才能从队列中提取元素。

在这里插入图片描述

DelayQueue属于排序队列,它的特殊之处在于队列的元素必须实现Delayed接口,该接口需要实现compareTo和getDelay方法。

getDelay方法:获取元素在队列中的剩余时间,只有当剩余时间为0时元素才可以出队列。

compareTo方法:用于排序,确定元素出队列的顺序。

实现方法:

1:在测试包jdk下创建延迟任务元素对象DelayedTask,实现compareTo和getDelay方法;

2:在main方法中创建DelayQueue并向延迟队列中添加三个延迟任务;

3:循环的从延迟队列中拉取任务。

package com.dack.test;
import java.util.Calendar;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class DelayedTask implements Delayed {
	public static DelayQueue<DelayedTask> queue;
	// 任务的执行时间
	private int executeTime = 0;
	// 业务需要的参数
	private String outStr = "";
	public static void main(String[] args) {
		DelayedTask.queue = new DelayQueue<DelayedTask>();
		// 可有可无
		DelayedTask.queue.add(new DelayedTask(2, "hello"));
		System.out.println(System.currentTimeMillis() + "服务启动");
		while (true) {
			DelayedTask delayedTask = DelayedTask.queue.poll();
			if (delayedTask != null) {
				String os = delayedTask.getOutStr();
				//可以随时添加新的延时任务
				DelayedTask.queue.add(new DelayedTask(2, "hello"));
				System.out.println(System.currentTimeMillis() + " 消费服务 ,传参" + os);
			}
		}
	}
	public DelayedTask(int delay) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.SECOND, delay);
		this.executeTime = (int) (calendar.getTimeInMillis());
	}
	// 业务所需的参数构造方法
	public DelayedTask(int delay, String str) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.SECOND, delay);
		this.executeTime = (int) (calendar.getTimeInMillis());
		this.outStr = str;
	}
	/**
	 * 元素在队列中的剩余时间
	 * 
	 * @param unit
	 * @return
	 */
	@Override
	public long getDelay(TimeUnit unit) {
		Calendar calendar = Calendar.getInstance();
		return executeTime - (calendar.getTimeInMillis());
	}
	/**
	 * 元素排序
	 * 
	 * @param o
	 * @return
	 */
	@Override
	public int compareTo(Delayed o) {
		long val = this.getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
		return val == 0 ? 0 : (val < 0 ? -1 : 1);
	}
	public int getExecuteTime() {
		return executeTime;
	}
	public void setExecuteTime(int executeTime) {
		this.executeTime = executeTime;
	}
	public String getOutStr() {
		return outStr;
	}
	public void setOutStr(String outStr) {
		this.outStr = outStr;
	}
}

到此这篇关于Java利用DelayQueue实现延迟任务代码实例的文章就介绍到这了,更多相关Java的DelayQueue实现延迟任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot集成redis lettuce

    springboot集成redis lettuce

    目前java操作redis的客户端有jedis跟Lettuce。本文主要介绍了springboot集成redis lettuce,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java怎么获取当前时间、计算程序运行时间源码详解(超详细!)

    Java怎么获取当前时间、计算程序运行时间源码详解(超详细!)

    有的时候,我们需要查看某一段代码的性能如何,最为简单的方式,可以通过计算该段代码执行的耗时,来进行简单的判断,这篇文章主要给大家介绍了关于Java怎么获取当前时间、计算程序运行时间的相关资料,需要的朋友可以参考下
    2024-07-07
  • SpringBoot集成整合JWT与Shiro流程详解

    SpringBoot集成整合JWT与Shiro流程详解

    安全管理是软件系统必不可少的的功能。根据经典的“墨菲定律”——凡是可能,总会发生。如果系统存在安全隐患,最终必然会出现问题,这篇文章主要介绍了SpringBoot集成JWT、Shiro框架的使用
    2022-12-12
  • JPA中@CreatedDate和@LastModifiedDate的使用方式

    JPA中@CreatedDate和@LastModifiedDate的使用方式

    这篇文章主要介绍了JPA中@CreatedDate和@LastModifiedDate的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java使用Swing实现一个模拟电脑计算器

    Java使用Swing实现一个模拟电脑计算器

    Java Swing 是一个用于创建 Java GUI(图形用户界面)的框架,它提供了一系列的 GUI 组件和工具,可以用于创建桌面应用程序,包括按钮、文本框、标签、表格等等,本文给大家介绍了Java使用Swing实现一个模拟计算器,感兴趣的同学可以自己动手尝试一下
    2024-05-05
  • java中vector与hashtable操作实例分享

    java中vector与hashtable操作实例分享

    java中vector与hashtable操作实例,有需要的朋友可以参考一下
    2014-01-01
  • Java使用quartz实现定时任务示例详解

    Java使用quartz实现定时任务示例详解

    这篇文章主要为大家介绍了Java使用quartz实现定时任务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • springboot加载复杂的yml文件获取不到值的解决方案

    springboot加载复杂的yml文件获取不到值的解决方案

    这篇文章主要介绍了springboot加载复杂的yml文件获取不到值的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java字节缓冲流原理与用法详解

    Java字节缓冲流原理与用法详解

    这篇文章主要介绍了Java字节缓冲流原理与用法,结合实例形式总结分析了java字节流与缓冲区相关原理与操作技巧,需要的朋友可以参考下
    2019-09-09
  • Java 8新特性 内建函数式接口详解

    Java 8新特性 内建函数式接口详解

    这篇文章主要介绍了Java 8新特性 内建函数式接口详解的相关资料,这里主要介绍4个基本函数式接口,需要的朋友可以参考下
    2016-12-12

最新评论