延时队列的使用

简介: 队列中的数据如何才能更好的去使用,一直存在困惑。使用场景也有些模糊,还在摸索中。有问题就留言吧,一起学习

1、创建延时队列的内容对象
每条需要处理的内容都要单独创建一个,然后再放到队列中

public class DelayedTask<T> implements Delayed {
    //延时时间,毫秒
    private long delay;
    private long expire;
    //需要处理的数据
    private T content;

    public DelayedTask(long delay, T content) {
        this.delay = delay;
        this.content = content;
        this.expire = System.currentTimeMillis() + delay;
    }

    /**
     * 用于延迟队列内部进行排序,将最先到期的放在队首,保证take出来的是到期的那个
     */
    @Override
    public int compareTo(Delayed o) {
        return (int)(this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
    }

    /**
     * 指定到期时间计算规则
     */
    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    @Override
    public String toString() {
        return "DelayedTask [delay=" + delay + ", expire=" + expire + ", Content=" + content + "]";
    }
}

2、测试

2.1、无限循环调用

public static void main(String[] args) throws InterruptedException {
        //1、创建队列
        DelayQueue<DelayedTask> queue = new DelayQueue<>();
        //2、插入数据
        for (int i = 1; i <= 3; i++) {
            int ti = 2000;//i==1 ? 20000 :(i==2?4000:8000);
            queue.put(new DelayedTask(ti, "first"));
        }
        System.out.println("start take task from queue" + DateUtil.now());
        //3、循环从队列中取数据
        while (!queue.isEmpty()) {
            //只有到期的数据才能取的出来,否则就阻塞等待
            DelayedTask ddddd = queue.take();
            System.out.println(ddddd);

        }
    }

2.2、线程池调用

import java.text.DateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.cnki.common.readfile.apitype.ProjectAnalysis;
import net.cnki.common.readfile.apitype.ProjectChildAnalysis;
import net.cnki.common.readfile.apitype.ResultAnalysis;
import net.cnki.common.readfile.apitype.SingleFileHandWorkAnalysis;
import net.cnki.common.readfile.apitype.SingleFileUploadsAnalysis;
import net.cnki.common.readfile.apitype.SingleFileZipAnalysis;


/**
 * 基于内存的队列的介绍,基于内存的队列,队列的大小依赖于JVM内存的大小,一般如果是内存占用不大且处理
 * 相对较为及时的都可以采用此种方法。如果你在队列处理的时候需要有失败重试机制,那么用此种队列就不是特别合适了。
 * @author ZhiPengyu
 *
 */
public class QueuePool {
    Logger logger = LoggerFactory.getLogger(QueuePool.class);

    private DelayQueue<DelayedTask> queue = new DelayQueue<>();
    private ScheduledExecutorService es = Executors.newScheduledThreadPool(5);
    
    
    /**
     * 构造执行
     */
    public QueuePool() {}
    /**
     * 添加信息至队列中
     * @param content
     */ 
    public void addQueue(String[] content) { 
        queue.offer(content); 
        execute();
    }
    /**
     * 初始化执行
     */ 
    public void execute() { 
        es.scheduleWithFixedDelay(new Runnable(){ 
            public void run() { 
                try { 
                    
                    DelayedTask ddddd = queue.take();
                    
                } catch (Exception e) { 
                    logger.error(e.toString());
                } 
            }    
        }, 100, 500, TimeUnit.MILLISECONDS); //表示延迟10毫秒后每500毫秒执行一次 。执行一次内,处理队列内容不限,执行一次后隔第二个时间参数后继续执行,一直到队列无内容 
    }//DAYS 天,HOURS 小时,MINUTES 分钟,SECONDS 秒,MILLISECONDS 毫秒
}
public static void main(String[] args) {
        QueuePool pool= new QueuePool();
        pool.addQueue(...);
    }
相关文章
|
弹性计算 数据可视化 机器人
基于ECS搭建ROS Kinetic机器人操作系统
将ROS机器人操作系统搭建至云端,实现远程的机器人控制
1007 1
|
C语言
C语言初阶⑧(结构体)知识点和笔试题
C语言初阶⑧(结构体)知识点和笔试题
225 0
|
4月前
|
人工智能 自然语言处理 数据挖掘
智能体(AI Agent)开发实战之【LangChain】(三)结合大模型基于RAG实现本地知识库问答优化
智能体(AI Agent)开发实战之【LangChain】(三)结合大模型基于RAG实现本地知识库问答优化
|
存储 关系型数据库 MySQL
|
10月前
|
机器学习/深度学习 人工智能 编解码
MV-Adapter:上交大、北航和 VAST 等联合开源多视图一致图像生成模型,将预训练的文生图扩散模型转为多视图生成器
MV-Adapter是由北京航空航天大学、VAST和上海交通大学联合开发的多视图一致图像生成模型。该模型能够将预训练的文本到图像扩散模型转化为多视图图像生成器,支持生成高分辨率的多视角图像。
649 18
MV-Adapter:上交大、北航和 VAST 等联合开源多视图一致图像生成模型,将预训练的文生图扩散模型转为多视图生成器
|
数据采集 机器学习/深度学习 数据挖掘
揭秘DataFrame缺失值处理的神秘面纱:从填充到删除,再到插值,你的数据能否起死回生?
【8月更文挑战第22天】在数据分析中,处理DataFrame内的缺失值至关重要。本文通过一个关于公司员工基本信息的例子,展示了三种常见方法:填充、删除和插值。首先构建了一个含有缺失值的DataFrame,然后使用均值填充年龄缺失值;接着演示了删除含缺失值的行;最后采用线性插值填补。此外,对于复杂情形,还可利用机器学习预测填充。合理处理缺失值能有效提升数据质量,为后续分析奠定坚实基础。
310 2
|
XML Java API
List与String相互转化的方法有哪些
摘要:本文概述了Java中List转换为String及反之的多种策略。使用`String.join()`可简洁地连接List元素;`StringBuilder`提供灵活控制;Java 8 Stream API收集器简化操作;Apache Commons Lang3的`StringUtils.join()`和Guava的`Joiner.on()`支持外部库的高效转换。
565 2
【Matlab 2019b】Matlab在figure中如何把横坐标或者纵坐标单位转换为10的几次方
本文提供了在Matlab中如何改变图形坐标轴单位的方法,举例说明了如何将横轴刻度标签设置为特定的年份,并调整刻度取值以匹配自变量的变化。
2025 1
|
物联网 5G SDN
|
存储 编译器 C语言
C语言中的关键字与标识符详解
C语言中的关键字与标识符详解
405 0