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. REST APIs

    REST APIs 旨在通过HTTP 的动作语义METHOD, 以替代各种传统CRUD 操作所带来的命名问题,例如 "/userAdd"."/userDelete&quo ...

  2. 记录在EF Core级联更新时出现的错误The database operation was expected to affect 1 row(s), but actually affected 0 row(s) (低级错误导致)

    错误提示:The database operation was expected to affect 1 row(s), but actually affected 0 row(s); data ma ...

  3. Spring Boot 动态修改 log level

    引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  4. CAD图与互联网地图网页端相互叠加显示技术分析和实现

    需求分析 之前相关的博文中介绍了如果在Web网页端展示CAD图形(唯杰地图云端图纸管理平台 https://vjmap.com/app/cloud),当一些CAD图纸有实际地理坐标位置时,如地形图等, ...

  5. Python的.gitignore模板

    参考:https://github.com/github/gitignore Python的.gitignore模板,记录一下方便查询 # Byte-compiled / optimized / DL ...

  6. Linux磁盘空间查看及空间满的处理

    问题 在部署应用到测试环境的时候,有些文件同步出错,最后定位到测试服务器空间满了. 解决 查看磁盘空间还剩多少空间 df -h 查看根目录下每个目录占用空间大小 du --max-depth=1 -h ...

  7. Nexus5x 修改Android开机动画

    1.制作帧动画 这里随便从网上找了一个gif图片,导入PS中,打开后会形成很多帧图层,选择导航栏中的文件->脚本->将图层导出到文件可以将所有图层导出来.要注意文件命名,Android会按 ...

  8. OpenHarmony3.1 Release版本特性解析——硬件资源池化架构介绍

    李刚 OpenHarmony 分布式硬件管理 SIG 成员 华为技术有限公司分布式硬件专家 OpenHarmony 作为面向全场景.全连接.全智能时代的分布式操作系统,通过将各类不同终端设备的能力进行 ...

  9. 利用SignalR创建即时消息

    1. 什么是SignalR? SignalR 是一个及时消息推送,它与.NET 的 WCF ,WebAPI类似 是客户端和服务器进行消息交换的一种工具 2.SignalR 的作用? 它可以实时同步在线 ...

  10. MySQL - 数据库设计步骤

    需求分析:分析用户的需求,包括数据.功能和性能需求. 概念结构设计:主要采用E-R模型进行设计,包括画E-R图. 逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换,进行关系规范化 ...