DelayQueue的特点就是插入Queue中的数据可以按照自定义的delay时间进行排序。只有delay时间小于0的元素才能够被取出。

这样子,只要开启一个线程循环从DelayQueue中取值执行,就可以达到想要的效果

定义

  1. 执行的任务类

    public abstract class Task implements Delayed, Runnable{
    private String id = "";
    private long start = 0; /**
    * @param id id
    * @param delayInMilliseconds 延时时间(单位:毫秒)
    */
    public Task(String id, long delayInMilliseconds){
    this.id = id;
    this.start = System.currentTimeMillis() + delayInMilliseconds;
    } public String getId() {
    return id;
    } @Override
    public long getDelay(TimeUnit unit) {
    long diff = this.start - System.currentTimeMillis();
    return unit.convert(diff, TimeUnit.MILLISECONDS);
    } @Override
    public int compareTo(Delayed o) {
    return Ints.saturatedCast(this.start - ((Task) o).start);
    } @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null) return false;
    if (!(o instanceof Task)) {
    return false;
    }
    Task t = (Task)o;
    return this.id.equals(t.getId());
    } @Override
    public int hashCode() {
    return this.id.hashCode();
    }
    }
  2. 任务处理类

    @Component
    public class TaskService {
    private TaskService taskService;
    // Task是自定义任务类,public abstract class Task implements Delayed, Runnable
    private DelayQueue<Task> delayQueue = new DelayQueue<Task>();
    // 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次
    @PostConstruct
    private void init() {
    taskService = this;
    // 开线程死循环执行任务
    new Thread(() -> {
    while (true) {
    try {
    Runnable task = delayQueue.take();
    task.run();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }).start();
    }
    // 添加任务
    public void addTask(Task task){
    if(delayQueue.contains(task)){
    return;
    }
    delayQueue.add(task);
    } public void removeTask(Task task){
    delayQueue.remove(task);
    } }

使用

  1. 新建自定义的任务类,需要继承Task

    private class DemoTask extends Task {
    
        DemoTask(String id, long delayInMilliseconds){
    super(id, delayInMilliseconds);
    }
    @Override
    public void run() {
    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String now = df.format(LocalDateTime.now());
    System.out.println("task id=" + this.getId() + " at time=" + now);
    } }
  2. 使用

    taskService.addTask(new DemoTask("1", 3000));

代码来源:

https://github.com/linlinjava/litemall

DelayQueue达到定时触发效果的更多相关文章

  1. 在Salesforce中创建Schedule的Job去定时触发对应的Class

    在Salesforce中也存在着Job的概念,当然了我们可以创建Schedule的Job去定时触发对应的Class,来完成我们所需要定时处理的功能,比如:定时同步数据. 具体处理步骤如下所示: 1): ...

  2. mysql 触发器和存储过程组合使用,实现定时触发操作

    mysql可以实现定时触发功能,比如说定于某某时间mysql数据库做什么工作,或每隔多长时间做什么工作. 第二种情况应用还是比较广的,比如说我希望每天检查一下我的数据信息,超过一个月的无用信息清除以腾 ...

  3. javascript 列表定时滚动效果

    HTML结构: <div style="width:200px;height:100px;overflow:hidden;border:1px solid #ddd;margin:20 ...

  4. linux 下crontab相关定时触发的配置规则

    linux 下crontab相关定时触发的配置规则: 1.基本格式 :* * * * * command(分 时 日 月 周 命令)2.取值范围:分钟1-59 每分钟用*或者 */1表示小时1-23( ...

  5. ASP.NET下回车键的触发效果

    在ASP.NET下,在客户端触发回车键,默认调用了页面中第一个button,这有时是非常头痛的,比如页面的第一个按键是注销键时,想想也够可怕了. .net提供设置默认回车键的属性,this.Form. ...

  6. 16Khz音频定时触发采样DMA存储过程

    一.AD Setting 1.Calibration (ADCAL) 2.设定ADC Chennel与SCANDIR等,在低功耗应用方案,选择PCLK/4,并设置SMP(tCONV = Samplin ...

  7. 如何减轻ajax定时触发对服务器造成的压力和带宽的压力?ajax-长轮训

    AJAX长轮询的方法来解决频繁对后台的请求,进一步减小压力 在实现过程发现AJAX的多次请求会出现多线程并发的问题又使用线程同步来解决该问题 个人对ajax长轮询的一点愚见 ajax请示后台时,后台程 ...

  8. Django 框架中定时触发脚本

    方法一: Django搭建的服务器一般都用作WEB网站进行访问,通常的形式是用户访问网站或点击按钮发送请求,Django检测到请求后进行相应的试图函数处理后返回页面给用户. 但是,我们有时会需要有一些 ...

  9. 修改ubuntu按电源键触发效果

    GUI内终端执行如下指令,或者加入开机启动脚本内 gsettings set org.gnome.settings-daemon.plugins.power button-power shutdown ...

随机推荐

  1. 【Pandas vs SQL】数据分析代码逐行比对,孰优孰劣?

    在数据分析领域,pandas是python数据分析基础工具,SQL是数据库最常用分析语言.二者有相通的地方,也有很大的语法不同,做起数据分析来,谁将更胜一筹呢? 做过业务开发.跟数据库打交道比较多的小 ...

  2. 题解0012:剪花布条(KMP)

    信奥一本通1465 KPM例题 题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465 题目描述:给出花布条和小饰条(字符串),求花布条中能剪 ...

  3. SpringBoot项目使用jasypt加解密

    Jasypt 是一个 Java 库,它允许开发者以最小的努力为他 / 她的项目添加基本的加密功能,而且不需要对密码学的工作原理有深刻的了解. 一.添加依赖 <dependency> < ...

  4. 443. String Compression - LeetCode

    Question 443. String Compression Solution 题目大意:把一个有序数组压缩, 思路:遍历数组 Java实现: public int compress(char[] ...

  5. Redis分布式锁实现Redisson 15问

    大家好,我是三友. 在一个分布式系统中,由于涉及到多个实例同时对同一个资源加锁的问题,像传统的synchronized.ReentrantLock等单进程情况加锁的api就不再适用,需要使用分布式锁来 ...

  6. Vue自定义组件之v-model的使用

    自定义组件之v-model的使用 v-model的语法糖可以为下面v-bind && @input联合完成: <input v-model="text"> ...

  7. JAVA - 缓冲和缓存

    JAVA - 缓冲和缓存 缓冲 Buffer 功能:协调上下层应用之间的性能差异.通过缓冲区的缓冲,当上层组件性能优于下层组件的时候,缓冲可以有效减少上层组件对下层组件的等待时间. 使用场景:IO流中 ...

  8. 直接将A类库复制到vs中的B类库,但是解决方案菜单中不显示

    1.将要复制的文件夹复制粘贴到你要用的vs项目中 2.右键 添加   现有项目  选中xxxxx.csproj文件   点击  打开   就可以了

  9. c++ 辗转相除(动图)

    #include<iostream> #include<cstdio> #include<iomanip> #include<cstring> usin ...

  10. DYOJ 【20220303模拟赛】最少分组 题解

    最少分组 题意 \(n\) 个点 \(m\) 条边的无向图,可以删掉 0 条或多条边,求满足条件的最小连通块数量: 对每个顶点对 \((a,b)\) ,若 \(a\) 和 \(b\) 同属于一个连通块 ...