简介
最近有一点富裕的时间,就想分享一下关于并发定时任务的内容,我也是查阅相关博客文档并自己捣鼓出来的一点小思路,欢迎各路大佬批评指正…
应用场景
不知道大家对定时任务的使用情况是怎样,就我个人而言接触的也比较少一点,分享一下我的使用案例,简单点一下使用场景。
最近需要获取硬件相关的信息(传感器信息)到平台上进行一个展示,相信有一点经验的小伙伴应该了解与硬件交互需要涉及到心跳计时等等(就不细说了),所以就用到定时任务
我使用的是ThreadPoolTaskScheduler类来进行定时任务的控制的
下面是我写的小Demo
代码逻辑
代码片(可直接运行)
package com.pj.apps.socket.tower; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledFuture; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.support.CronTrigger; public class TaskTest { //需要对它进行初始化 private static ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); //存储定时任务编号及任务 private static Map<String,ScheduledFuture<?>> map = new HashMap<>(); //使用静态代码块来初始化ThreadPoolTaskScheduler static { threadPoolTaskScheduler.initialize(); } //开启定时任务的方法 private static void startCron(String tNo) { //通过使用它的方法来对任务进行开启和关闭,使用Cron表达式,表示时间间隔并重复执行 ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(new MyRunnable(tNo), new CronTrigger("*/5 * * * * ?")); map.put(tNo, future); } //停关闭定时任务 private static void closeCron(ScheduledFuture<?> future) { if (future != null) { future.cancel(true); } } //定时任务线程 private static class MyRunnable implements Runnable { private String tNo; public MyRunnable(String tNo) { this.tNo = tNo; } @Override public void run() { System.out.println("线程编号"+tNo+"定时任务逻辑内容..."); } } public static void main(String[] args) { startCron("9527"); startCron("9528"); } }
运行结果
思路简单梳理
关于ThreadPoolTaskScheduler类更详细使用可参考大佬们的文章或者百度,这里需要注意的是使用它需要进行初始化,我这里在静态代码块中进行了初始化,也可以提出去初始化。
创建了一个map容器是为了存储键值对【定时线程编号】以及对应的【定时线程】,可以方便我们后面可以很好的对每个定时任务进行关闭,因为关闭定时器的方法中需要传的参数是一个定时任务ScheduledFuture,所以我们可以通过线程编号去找到它,再进行一个关闭。
通过Cron表达式来描述定时周期,我这里设置的是每隔5秒执行一次,小伙伴们自行去了解一下Cron表达式。
自定义了一个任务内容主体线程类MyRunnable,将需要定时执行的逻辑放到这个里面去,这里还用了一个带参构造,方便我们传一些参数加入到执行定时逻辑里面去,我这里构造传的是模拟的线程编号,需要传其他更多的参数可以同样的方法进行参数的传递。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。