首页 > 编程语言 >[转]【Java】DelayQueue 的延时任务实现

[转]【Java】DelayQueue 的延时任务实现

时间:2024-10-22 14:32:04浏览次数:6  
标签:Java 示例 DelayedTask queue expire 延时 DelayQueue public

来源:Kimi.ai 

在Java中,DelayQueue 是一个非常有用的工具,用于实现延迟任务。以下是一个使用示例,它展示了如何使用 DelayQueue

基本使用示例:

  • 首先,你需要创建一个实现了 Delayed 接口的类。这个类需要实现 getDelay 方法,该方法返回延迟时间,以及 compareTo 方法,用于确定元素在队列中的顺序。
  • 然后,你可以创建 DelayQueue 的实例,并向其中添加实现了 Delayed 接口的对象。
  • 最后,你可以从队列中取出对象,take 方法会阻塞直到队列中存在一个延迟时间已过期的对象。

示例代码:

public class DelayedTask implements Delayed {
    private long delayTime;
    private final long expire;

    public DelayedTask(long delayTime) {
        this.delayTime = delayTime;
        this.expire = System.nanoTime() + TimeUnit.NANOSECONDS.convert(delayTime, TimeUnit.MILLISECONDS);
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(expire - System.nanoTime(), TimeUnit.NANOSECONDS);
    }

    @Override
    public int compareTo(Delayed other) {
        DelayedTask x = (DelayedTask) other;
        long diff = this.expire - x.expire;
        return (diff == 0) ? 0 : ((diff < 0) ? -1 : 1);
    }

    public void execute() {
        // 任务执行逻辑
    }
}

// 使用示例
public void doExecute() {
    DelayQueue<DelayedTask> queue = new DelayQueue<>();
    queue.put(new DelayedTask(1000)); // 1秒后执行
    queue.put(new DelayedTask(3000)); // 3秒后执行
    queue.put(new DelayedTask(5000)); // 5秒后执行

    while (true) {
        DelayedTask task = queue.take();
        task.execute();
    }
}

这个示例展示了 DelayQueue 在实际开发中的灵活性和强大功能。你可以根据自己的需求,将这些概念应用到你的项目中。

标签:Java,示例,DelayedTask,queue,expire,延时,DelayQueue,public
From: https://www.cnblogs.com/z5337/p/18492677

相关文章

  • 面试常见Java八股文整理!!!
    1.Java线程start方法和run方法的区别start方法启动了一个新的线程,而run方法不能启动一个新线程,还是在main线程下运行,程序依然是主线程一个线程在运行。调用start方法可以启动线程,而run方法只是thread的一个普通方法还是在主线程中执行。通过start()方法来启动的新线程,处于就......
  • JavaScript 第25章:Vue 基础
    在学习JavaScript的第25章关于Vue的基础知识时,我们将从以下几个方面来了解Vue框架,并通过一个实战案例来巩固所学的知识。Vue概述Vue.js是一个用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,易于上手,同时......
  • 史上最强Java面试八股文合集,持续更新!
    线程池核心参数补充:还有一个参数 threadFactory(线程工厂):用于创建新线程的工厂,通常用于给线程设定名称、设置为守护线程等。默认的线程工厂会创建一个普通的、非守护线程。ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor( 3,......
  • Java相关面试题(2024大厂高频面试题系列)
    一、多线程基础基础知识1.并发编程1.1并发编程的优缺点优点:充分利用多核CPU的计算能力,通过并发编程的形式将多核CPU的计算能力发挥到极致,性能得到提升。方面进行业务的拆分。提高系统并发能力和性能:高并发系统的开发,并发编程会显得尤为重要,利用好多线程机制可以大大提高......
  • Spring AI : Java写人工智能的应用框架
    SpringAI:为Java开发者提供高效集成大模型能力的框架当前Java调用大模型时,面临缺乏优质AI应用框架的挑战。Spring作为资深的Java应用框架提供者,通过推出SpringAI来解决这一问题。它借鉴了langchain的核心理念,并结合了Java面向对象编程的特点,为开发者提供了统一且可灵活替换......
  • vue-springboot基于JavaWeb的智慧养老院管理系统的设计与实现 附源码
    目录项目介绍系统实现截图源码获取地址下载技术栈开发核心技术介绍:为什么选择最新的Vue与SpringBoot技术核心代码部分展示项目介绍该系统从三个对象:由管理员和家属、护工来对系统进行设计构建。主要功能包括:个人信息修改,对家属信息、护工信息、老人入住、外出报备、......
  • JavaScript从零学起 —— 数据类型(进阶篇6)
    说明:此文章用作个人学习记录,若有任何问题或建议欢迎大家在评论区讨论文章目录前言一、日期(Date)1.Date类型的定义2.创建Date3.常用方法4.日期格式化5.常见问题与解决方案二、正则表达式(RegExp)1.正则表达式的定义2.创建正则表达式3.匹配常用字符4.常......
  • Java中的控制结构中的顺序结构和分支结构
    文章目录前言1.顺序结构2.分支结构2.1选择语句if2.2if格式12.3if语句格式22.3if语句格式3if语句与三元运算符2.1选择语句switch前言我是一名来自延边大学人工智能专业的热爱街舞的大四学生,目前在学习Java,我会根据我的学习路线给大家分享学习经验,这章我们学习Java中......
  • Java项目中引入达梦数据库依赖驱动并且操作链接数据库
    本人详解作者:王文峰,参加过CSDN2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的Java开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯山峯转载说明:务必注明来源(注明:作者:王文峰哦)Java项目中引......
  • 【开源免费】基于SpringBoot+Vue.JS读书笔记共享平台(JAVA毕业设计)
    本文项目编号T029,文末自助获取源码\color{red}{T029,文末自助获取源码}......