美文网首页
定时任务

定时任务

作者: 爱健身的兔子 | 来源:发表于2022-03-22 10:45 被阅读0次

应用场景

  • 清理日志

  • 延时消费

  • 锁续期
  • 数据对比

  • 数据刷新


定时任务实现

阶段一

每隔一小时清理日志

main(){
    Thread t = new Thread(()->{
        while(true){
            sleep(一小时);
            清理日志------
        }
    })   

}
  • 优点:简单容易实现

  • 缺点:单一,不能实现多个定时任务

阶段二
class Task implements Runnable{
    void run(){
        清理日志;
    }
}
class TimeOut{
    private Date timeout;//执行的日志
}
class Timer extends Thread{
    private Task task;
    private TimeOut timeOut;
    void run(){
     while(true){
        sleep(一分钟);
        if(timeOut到期){
            task.run();    
        }
    }
  }
}
main(){
     for(一堆任务){
        new Timer(task,timeOut).start();
    }
}

定时任务数据结构

class TimeTask implements Comparable<TimeTask>{
    private Long nextExeTime; 
    private Runnable job;
}
单链表
单链表
main(){
    while(true){
        sleep(一分钟){
            for(TimeTask : list){
                if(timeTask不需要执行){
                    list.remove(timetask);
                }
                if(TimeTask是否到期){
                    timetask.run();
                    timetask.nextExeTime = 计算下一个执行时间;
                }
            }
        }
    }
}
  • 优点:简单,适用于处理少量任务

  • 缺点:时间复杂度高,O(n);

小顶堆
小顶堆.jpg
main(){
    while(true){
       TimeTask = heep.peek(); 
       long sleepTime;
       while((sleepTime = timeTask.getNextExeTime - now) > 0 ){
          timeTask.run();
       }
       heep.remove();
       计算下一次 timeTask.nextExeTime
       if(还需要执行){
            heep.add(timeTask);
      }
   }
}
  • 优点:使用小顶堆时间复杂度: log(n),减少不必要的空轮询。

  • 缺点:不适用于任务多,任务间隔比较短的任务,比如秒级,毫秒级的大量定时任务的执行。性能损耗严重

  • 参考实现:jdk的Timer

时间轮
  1. 一级时间轮
class TimeOut{
    TimeOut pre;
    TimeOut next;
    TimeTask task;
}
class Bucket{
    TimeOut head;
    TimeOut tail;
}
class WheelTimer{
      Bucket[] buckets;
      TimeUnit timeUnit;
      Long tickDuration;

    main(){
       int tick = 0;
       //不断轮询buckets,类似钟表的滴答
       while(true){
         //休眠一个tick,需要接口timeunit计算。
         sleep(tickTime);
        TimeOut current = bucket[tick];
        while(current.next != null){
            current.run();
            current = current.next;
        }
      }
   }
}
  • 优点:简单,支持各种精度

  • 缺点:对于任务多,时间跨度大的任务,需要很多的bucket,占用空间

  1. round时间轮
class TimeOut{
    TimeOut pre;
    TimeOut next;
    TimeTask task;
    Integer round;
}

class WheelTimer{
    main(){
       int tick = 0;
       //不断轮询buckets,类似钟表的滴答
       while(true){
         //休眠一个tick,需要接口timeunit计算。
         sleep(tickTime);
        TimeOut current = bucket[tick];
        while(current.next != null){
            current.round--;
            if(current.round<=0){
               current.run();
            }
            current = current.next;
        }
      }
   }
}
  1. 分成时间轮

参考:时间轮算法

相关文章

  • 2019-07-31定时任务

    定时任务 定时任务实现方法 系统默认定时任务 用户自定义设置定时任务 定时任务配置文件 定时任务启动 定时任务样例...

  • 分布式定时调度-xxl-job

    一、定时任务概述 1.1 定时任务认识 1.1.1 什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为...

  • day 22 操作系统定时任务

    系统定时任务概念==生活中闹钟 系统定时任务实现方法: 实现定时任务配置: 定时任务如何进行设置 定时任务编写常见...

  • 7月30日 定时任务

    定时任务 代替人自动完成一些任务 定时任务实现的方法 定时任务软件:cronie定时任务软件:atd --- 设...

  • SpringBoot 定时任务

    1.如何定时任务 1.1 开启定时任务 1.2 @Scheduled(预定的)选择要定时执行的任务 == 定时在前...

  • crontab 定时任务

    查看当前用户的定时任务列表 创建(编辑)定时任务列表 定时任务格式 删除定时任务 注意 一定要设置crontab的...

  • 2019-10-14 定时任务方案

    定时任务方案 定时任务实现

  • Linux定时任务Crontab

    定时任务服务提供crontab命令来设定任务 定时任务命令: 定时任务服务提供crontab命令来设定任务 cro...

  • Android中 Handler延时 定时任务

    1.延时 2.定时任务,间隔固定时间执行某项任务 3.定时任务,间隔固定时间执行某项操作后关闭定时任务 参考:ht...

  • crondtab 定时任务

    编辑定时任务 crontab -e 查看定时任务 crontab -l 删除定时任务 crontab -r 如:*...

网友评论

      本文标题:定时任务

      本文链接:https://www.haomeiwen.com/subject/yoqfjrtx.html