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

总结

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

相关文章

  • java list随机抽取元素的案例

    java list随机抽取元素的案例

    这篇文章主要介绍了java list随机抽取元素的案例,具有很好的参考,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 深入解析Java中的Class Loader类加载器

    深入解析Java中的Class Loader类加载器

    这篇文章主要介绍了Java中的类加载器,是Java入门学习中的基础知识,需要的朋友可以参考下
    2016-03-03
  • Java 异常机制Exception和自定义异常

    Java 异常机制Exception和自定义异常

    这篇文章主要介绍了Java 异常机制Exception+自定义异常,异常分三种检查性异常、运行时异常、错误ERROR,下文对其更多详细介绍,需要的小伙伴可以参考一下
    2022-05-05
  • Mybatis in条件传参的三种实现方式(直接$,List,[])

    Mybatis in条件传参的三种实现方式(直接$,List,[])

    这篇文章主要介绍了Mybatis in条件传参的三种实现方式(直接$,List,[]),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 教你利用SpringBoot写一个属于自己的Starter

    教你利用SpringBoot写一个属于自己的Starter

    如果我们将可独立于业务代码之外的功配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可,SpringBoot为我们完成自动装配,简直不要太爽,这篇文章主要给大家介绍了关于如何利用SpringBoot写一个属于自己的Starter,需要的朋友可以参考下
    2022-03-03
  • 解析Spring Mvc Long类型精度丢失问题

    解析Spring Mvc Long类型精度丢失问题

    在平时开发过程中,经常会使用long类型作为id的类型,但是在使用过程中会导致long类型数据转换为number类型时的后两位变为0,今天小编给大家分享Spring Mvc Long类型精度丢失问题,需要的朋友参考下吧
    2021-06-06
  • 使用Postman自动生成Cookie并转换为Java代码的实现

    使用Postman自动生成Cookie并转换为Java代码的实现

    在接口测试中,有时候需要在请求中携带Cookie信息,为了方便测试,我们可以使用Postman来自动生成Cookie,并将其转换为Java代码,以便在自动化测试中使用,下面将介绍如何实现这一功能,需要的朋友可以参考下
    2024-11-11
  • Java的ArrayList扩容源码解析

    Java的ArrayList扩容源码解析

    这篇文章主要介绍了Java的ArrayList扩容源码解析,通过动态扩容,ArrayList能够在添加元素时保持高效的性能,扩容操作是有一定开销的,但由于扩容的时间复杂度为O(n),其中n是当前元素个数,所以平均情况下,每次添加元素的时间复杂度仍然是O(1),需要的朋友可以参考下
    2024-01-01
  • 深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    上次有朋友问我,java中的类可以是static吗?我给他肯定的回答是可以的,在java中我们可以有静态实例变量、静态方法、静态块。当然类也可以是静态的,下面小编整理了些关于java中的static class相关资料分享在脚本之家平台供大家参考
    2015-11-11
  • Java动态规划篇之线性DP的示例详解

    Java动态规划篇之线性DP的示例详解

    这篇文章主要通过几个例题为大家详细介绍一些Java动态规划中的线性DP,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-11-11

最新评论