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

总结

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

相关文章

  • 聊聊SpringBoot自动装配的魔力

    聊聊SpringBoot自动装配的魔力

    这篇文章主要介绍了SpringBoot自动装配的魔力,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java 多线程之间共享数据

    Java 多线程之间共享数据

    这篇文章主要介绍了Java 多线程之间共享数据,围绕Java 多线程之间共享数据展开文章内容线程范围的共享变量、使用Map实现线程范围内数据的共享、ThreadLocal实现线程范围内数据的共享,需要的朋友可以参考一下
    2021-10-10
  • 深入理解Java中的EnumMap和EnumSet

    深入理解Java中的EnumMap和EnumSet

    这篇文章主要介绍了深入理解Java中的EnumMap和EnumSet,一般来说我们会选择使用HashMap来存储key-value格式的数据,考虑这样的特殊情况,一个HashMap的key都来自于一个Enum类,这样的情况则可以考虑使用本文要讲的EnumMap,需要的朋友可以参考下
    2023-11-11
  • BeanUtils.copyProperties()参数的赋值顺序说明

    BeanUtils.copyProperties()参数的赋值顺序说明

    这篇文章主要介绍了BeanUtils.copyProperties()参数的赋值顺序说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java往php传数据操作方法

    java往php传数据操作方法

    在本篇内容里小编给大家分享的是关于java往php传数据操作方法和技巧,需要的朋友们可以跟着学习下。
    2018-12-12
  • 浅谈Spring Batch在大型企业中的最佳实践

    浅谈Spring Batch在大型企业中的最佳实践

    本篇文章主要介绍了浅谈Spring Batch在大型企业中的最佳实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • javaweb文件打包批量下载代码

    javaweb文件打包批量下载代码

    这篇文章主要为大家详细介绍了javaweb文件打包批量下载代码,批量下载未批改作业,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • java单链表使用总结

    java单链表使用总结

    这篇文章主要为大家详细介绍了java单链表使用总结,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • java实现301跳转和重定向的方法

    java实现301跳转和重定向的方法

    301跳转和重定向是做项目的时候经常需要用到的,本文给大家分享的是在java中301跳转和重定向的方法,需要的小伙伴参考下吧。
    2015-03-03
  • 浅谈java多态的实现主要体现在哪些方面

    浅谈java多态的实现主要体现在哪些方面

    下面小编就为大家带来一篇浅谈java多态的实现主要体现在哪些方面。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09

最新评论