首页 > 其他分享 >定时任务

定时任务

时间:2024-02-29 10:44:25浏览次数:18  
标签:name void private 任务 static import 定时 public

配置接口

package test;

import java.util.concurrent.TimeUnit;

public interface IScheduledCfg {

    String getName();

    int getCount();

    long getInitialDelay();

    long getCycleTime();

    TimeUnit getTimeUnit();
}

配置类

package test;

import lombok.EqualsAndHashCode;
import lombok.Getter;

import java.util.concurrent.TimeUnit;

@Getter
@EqualsAndHashCode(of = "name")
public class NewScheduledCfg implements IScheduledCfg {
    /**
     * 线程名
     */
    private String name;
    /**
     * 线程数,默认都是1
     */
    private int count;
    /**
     * 延时/ms
     */
    private long initialDelay;
    /**
     * 周期时间/ms
     */
    private long cycleTime;
    /**
     * 时间单位
     */
    private TimeUnit timeUnit;

    public NewScheduledCfg(String name, int count, long initialDelay, long cycleTime, TimeUnit timeUnit) {
        this.name = name;
        this.count = count;
        this.initialDelay = initialDelay;
        this.cycleTime = cycleTime;
        this.timeUnit = timeUnit;
    }
}

定时任务

package test;

import com.google.common.util.concurrent.ThreadFactoryBuilder;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ScheduledTask {

    private IScheduledCfg scheduledCfg;

    private Runnable task;

    private long cycleTime;

    private ScheduledThreadPoolExecutor executor;

    public ScheduledTask(IScheduledCfg scheduledCfg, Runnable task) {
        this.scheduledCfg = scheduledCfg;
        this.task = task;
    }

    public void start() {
        start(cycleTime);
    }

    public void start(long time) {
        try {
            if (executor == null || executor.isShutdown()) {
                executor = new ScheduledThreadPoolExecutor(scheduledCfg.getCount(),
                        new ThreadFactoryBuilder().setPriority(Thread.MAX_PRIORITY)
                                .setNameFormat(scheduledCfg.getName()).build());
            }
            cycleTime = time <= 0 ? scheduledCfg.getCycleTime() : time;
            executor.scheduleWithFixedDelay(
                    task, scheduledCfg.getInitialDelay(), cycleTime, scheduledCfg.getTimeUnit());
        } catch (Exception e) {
            // 这里日志打印
        }
    }

    public void stop() {
        try {
            executor.shutdown();
            executor.awaitTermination(3, TimeUnit.SECONDS);
        } catch (Exception e) {
             // 这里日志打印
        } finally {
            try {
                executor.shutdownNow();
            } catch (Exception e) {
                 // 这里日志打印
            }
        }
    }
}

定时线程池

package test;

import test.ScheduledTimerTask;

import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 定时器、循环线程
 */
@SuppressWarnings("squid:S1181")
public class ScheduledThreadPool {

    private static ScheduledThreadPool instance = new ScheduledThreadPool();
    /**
     * 定时器
     */
    private static Map<String, ScheduledTimerTask> timerTasks = new ConcurrentHashMap<>();
    /**
     * 循环线程
     */
    private static Map<IScheduledCfg, ScheduledTask> scheduledTaskMap = new ConcurrentHashMap<>();

    private ScheduledThreadPool() {

    }

    public static ScheduledThreadPool getIns() {
        return instance;
    }

    public static void addOneScheduledTask(IScheduledCfg cfg, Runnable runnable) {
        addOneScheduledTask(cfg, runnable, cfg.getCycleTime());
    }

    public static void addOneScheduledTask(IScheduledCfg cfg, Runnable runnable, long time) {
        try {
            removeOneScheduledTask(cfg);

            ScheduledTask scheduledTask = new ScheduledTask(cfg, runnable);
            scheduledTaskMap.put(cfg, scheduledTask);
            scheduledTask.start(time);
        } catch (Throwable e) {
            // 日志打印
        }
    }

    public static void removeOneScheduledTask(IScheduledCfg cfg) {
        try {
            ScheduledTask scheduledTask = scheduledTaskMap.remove(cfg);
            if (scheduledTask != null) {
                scheduledTask.stop();
            }
        } catch (Throwable e) {
            // 日志打印
        }
    }

    public static void addOneTimeTask(String name, Runnable runnable, Date date) {
        try {
            removeOneTimeTask(name);

            ScheduledTimerTask scheduledTimerTask = new ScheduledTimerTask(name, runnable, date);
            timerTasks.put(name, scheduledTimerTask);
            scheduledTimerTask.start();
        } catch (Throwable e) {
            // 日志打印
        }
    }

    public static void removeOneTimeTask(String name) {
        try {
            ScheduledTimerTask scheduledTimerTask = timerTasks.remove(name);
            if (scheduledTimerTask != null) {
                scheduledTimerTask.stop();
            }
        } catch (Throwable e) {
            // 日志打印
        }
    }

    /**
     * 定时器、循环线程重启
     */
    public static void activeAll() {
        Map<String, ScheduledTimerTask> iteratorMap = new ConcurrentHashMap<>(timerTasks);
        for (Map.Entry<String, ScheduledTimerTask> next : iteratorMap.entrySet()) {
            if (!next.getValue().start()) {
                timerTasks.remove(next.getKey());
            }
        }
        scheduledTaskMap.values().forEach(ScheduledTask::start);
    }

    /**
     * 定时器、循环线程终止
     */
    public static void stopAll() {
        timerTasks.values().forEach(ScheduledTimerTask::stop);
        scheduledTaskMap.values().forEach(ScheduledTask::stop);
    }
}

使用示例

    public static void main(String[] args){
        String taskId = "test";
        Long initalDelay = 10L;
        Long interval = 100L;
        int threadCount = 1;
        scheduledCfg = new NewScheduledCfg(taskId, threadCount, initialDelay, interval, TimeUnit.MILLISECONDS);
        ScheduledThreadPool.addOneScheduledTask(scheduledCfg, this::work);
    }

    private void work(){
        // TODO
    }

标签:name,void,private,任务,static,import,定时,public
From: https://www.cnblogs.com/liu-im/p/18042918

相关文章

  • .net 应用程序 生成Docker映像时 dotnet restore找不到自定义源的包的问题,ContainerBu
    一、问题:我们在.net应用中生成Docker映像时,会出现ContainerBuildAndLaunch任务意外失败的问题。 查看输出窗口发现,是执行dotnetrestore时,找不到包的问题,因为我的这些包是在自己的私有源上二、解决方案:在Dockerfile文件中,在执行dotnetrestore前一行添加nuget私有源就行......
  • FastAPI系列:后台任务进程
    注:后台任务应附加到响应中,并且仅在发送响应后运行用于将单个后台任务添加到响应中fromfastapiimportFastAPIfromfastapi.responsesimportJSONResponsefromstarlette.backgroundimportBackgroundTaskfrompydanticimportBaseModelapp=FastAPI()classUser(B......
  • c# 4.8 实现Windows 定时任务计划(Task Scheduler)
    分享一个我自己写的 Windows定时任务计划(TaskScheduler)动态创建代码,没做太多封装,留个实现笔记首先封装一个简单配置项的类publicclassTaskSchedulerConfig{///<summary>///引用程序路径///</summary>publicstringApplicationPath{get;set;......
  • c# 4.8 实现Windows 定时任务计划(Task Scheduler)
    分享一个我自己写的 Windows定时任务计划(TaskScheduler)动态创建代码,没做太多封装,留个实现笔记首先封装一个简单配置项的类1publicclassTaskSchedulerConfig2{3///<summary>4///引用程序路径5///</summary>6publicstringApplicati......
  • 任务系统之API子任务
    日常运维工作中有许多的任务要执行,例如项目发布/数据备份/定时巡检/证书更新/漏洞修复等等,大部分的任务都会有多个步骤共同完成,例如一个发布任务会有拉代码、编译、分发、通知等等步骤,而不同的任务可能还包含相同或相似的步骤,例如对于相同语言相同架构的不同项目来说,他们的发布任......
  • SpringBoot 1x 系列之(十一)Spring Boot与任务
    SpringBoot与任务异步任务、定时任务、邮件任务1.异步任务1.1应用场景执行一些操作(如:邮件任务等)不想阻塞当前线程的情况下,可以通过多线程的方式进行异步处理。1.2快速使用主配置类//开启@Async异步注解功能@EnableAsync@EnableRabbit@EnableCaching@MapperScan("co......
  • Apscheduler 使用Redis集群做为任务存储
    背景由于原生的apscheduler仅支持redis单节点连接,不支持redis集群,所以本人基于原生的RedisJobStore自己修改了一个专门用于连接redis集群的类RedisClusterJobStore修改点有以下内容:修改类名RedisJobStore为RedisClusterJobStore将原始导入的redis替换为rediscluster将原始......
  • 定时器
    定时器的概念程序里的定时器主要实现的功能是在未来的某个时间点执行相应的逻辑interval:间隔时间,即定时器需要在interval时间后执行StartTimer:添加一个定时器任务StopTimer:结束一个定时器任务PerTickBookkeeping:检查定时器系统中,是否有定时器实例已经到期,相当于定义了最小......
  • asp.net quartz 定时器 miniapi sqlite数据库 cors
    dotnet_miniapi_quartz_ipaddress_check/Dtos.csusingSystem.ComponentModel.DataAnnotations;namespaceGameStore.Api.Dtos;publicrecordIpAddressDto(Guidid,stringip,stringname,stringdomain,......
  • 如何管理时间来提高工作效率?能定时提醒待办计划的软件
    因为每天需要完成的工作任务繁多,而时间有限,我一直在寻找有效提高工作效率的方法。我发现,进行高效的时间管理是提升工作效率的一个显著且易于执行的策略。那么如何管理时间来提高工作效率呢?在实践中,我采用了几种方法来管理我的时间。我开始制定每日工作计划,列出当天需要完成的任务......