Java实现并发执行定时任务并手动控制开始结束

 更新时间:2024年05月13日 09:51:57   作者:日常500  
这篇文章主要介绍了Java实现并发执行定时任务并手动控制开始结束,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

简介

最近有一点富裕的时间,就想分享一下关于并发定时任务的内容,我也是查阅相关博客文档并自己捣鼓出来的一点小思路,欢迎各路大佬批评指正…

应用场景

不知道大家对定时任务的使用情况是怎样,就我个人而言接触的也比较少一点,分享一下我的使用案例,简单点一下使用场景。

最近需要获取硬件相关的信息(传感器信息)到平台上进行一个展示,相信有一点经验的小伙伴应该了解与硬件交互需要涉及到心跳计时等等(就不细说了),所以就用到定时任务

我使用的是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,将需要定时执行的逻辑放到这个里面去,这里还用了一个带参构造,方便我们传一些参数加入到执行定时逻辑里面去,我这里构造传的是模拟的线程编号,需要传其他更多的参数可以同样的方法进行参数的传递。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IDEA JeeSite框架httpSession.invalidate()无效问题解决方案

    IDEA JeeSite框架httpSession.invalidate()无效问题解决方案

    这篇文章主要介绍了IDEA JeeSite框架httpSession.invalidate()无效问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 基于SpringBoot实现图片防盗链的两种方式

    基于SpringBoot实现图片防盗链的两种方式

    出于安全和性能的考虑,我们希望服务器返回的图片资源仅在指定网站内展示,防止爬虫或其它站点直接引用图片地址进行下载或展示,进而消耗服务器资源,所以本文给大家介绍了基于SpringBoot实现图片防盗链的两种方式,需要的朋友可以参考下
    2025-02-02
  • java基础详解之数据类型知识点总结

    java基础详解之数据类型知识点总结

    这篇文章主要介绍了java基础详解之数据类型知识点总结,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很大的帮助,需要的朋友可以参考下
    2021-04-04
  • maven中resource配置的实现示例

    maven中resource配置的实现示例

    我们在使用Maven组件来构建项目的时候,通常将配置文件放在资源文件目录下,本文主要介绍了maven中resource配置的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 深入浅出JAVA MyBatis-快速入门

    深入浅出JAVA MyBatis-快速入门

    这篇文章主要介绍了在今天这篇博文中,我将要介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和hibernate之间存在着怎么样的关系,大家这些问题一起通过本文学习吧
    2021-06-06
  • SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

    SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

    在使用 IntelliJ IDEA 开发基于 Spring Boot 框架的 Java 程序时,可能会出现找不到或无法加载主类 com.example.springboot.SpringbootApplication的错误提示,下面我们来看看如何解决吧
    2025-03-03
  • springboot如何使用redis的incr创建分布式自增id

    springboot如何使用redis的incr创建分布式自增id

    这篇文章主要介绍了springboot如何使用redis的incr创建分布式自增id,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • java实现遗传算法实例分享(打印城市信息)

    java实现遗传算法实例分享(打印城市信息)

    本文介绍java实现遗传算法的实例,代码中使用城市名做为数据,可以打印当前代数的所有城市序列,以及其相关的参数,大家参考使用吧
    2014-01-01
  • 用dom4j生成xml,去掉xml头的方法

    用dom4j生成xml,去掉xml头的方法

    今天小编就为大家分享一篇用dom4j生成xml,去掉xml头的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • java自定义类加载器代码示例

    java自定义类加载器代码示例

    这篇文章主要介绍了java自定义类加载器代码示例,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12

最新评论