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实现延迟任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java+Selenium实现控制浏览器的启动选项Options

    Java+Selenium实现控制浏览器的启动选项Options

    这篇文章主要为大家详细介绍了如何使用java代码利用selenium控制浏览器的启动选项Options的代码操作,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-01-01
  • Java飞行记录器JFR功能实现过程图解

    Java飞行记录器JFR功能实现过程图解

    这篇文章主要介绍了Java飞行记录器JFR功能实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • MyBatis中SqlSession生命周期的使用

    MyBatis中SqlSession生命周期的使用

    SqlSession是MyBatis的核心接口之一,本文主要介绍了MyBatis中SqlSession生命周期的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • 踩坑Debug启动失败,无报错信息问题

    踩坑Debug启动失败,无报错信息问题

    在进行项目debug时遇到了无法启动的问题,项目一直处于正在启动状态,但未出现任何报错信息,分析原因可能是存在不合法的断点位置,即断点未打在方法内部,解决方法是检查所有断点信息,并移除非法断点,之后项目能够正常启动
    2023-02-02
  • 详解SpringBoot可执行Jar包运行原理

    详解SpringBoot可执行Jar包运行原理

    SpringBoot有一个很方便的功能就是可以将应用打成可执行的Jar,那么大家有没想过这个Jar是怎么运行起来的呢,本篇博客就来介绍下 SpringBoot可执行Jar包的运行原理,需要的朋友可以参考下
    2023-05-05
  • springSecurity使用实战指南

    springSecurity使用实战指南

    本文系统讲解了Spring Security的核心功能,包括实战举例,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • java实现简单的给sql语句赋值的示例

    java实现简单的给sql语句赋值的示例

    这篇文章主要介绍了java实现简单的给sql语句赋值的示例,需要的朋友可以参考下
    2014-05-05
  • SpringBoot中yml的数据绑定示例

    SpringBoot中yml的数据绑定示例

    本文主要介绍了SpringBoot中yml的数据绑定示例,借助于YAML的简洁语法和结构化特性,我们能够轻松地管理应用程序的配置信息,使得配置文件更加清晰易读,感兴趣的可以了解一下
    2023-11-11
  • SpringBoot详细讲解异步任务如何获取HttpServletRequest

    SpringBoot详细讲解异步任务如何获取HttpServletRequest

    在使用框架日常开发中需要在controller中进行一些异步操作减少请求时间,但是发现在使用@Anysc注解后会出现Request对象无法获取的情况,本文就此情况给出完整的解决方案
    2022-04-04
  • 创建自定义的Java注解类的方法

    创建自定义的Java注解类的方法

    这篇文章主要介绍了创建自定义的Java注解类的方法,主要部分为创建一个带有Java类型@interface的新类型,需要的朋友可以参考下
    2015-07-07

最新评论