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的Synchronized锁原理和优化

    浅谈Java的Synchronized锁原理和优化

    这篇文章主要介绍了Java的Synchronized锁原理和优化,synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果,需要的朋友可以参考下
    2023-05-05
  • Java中的RestTemplate使用详解

    Java中的RestTemplate使用详解

    这篇文章主要介绍了Java中的RestTemplate使用详解,Spring内置了RestTemplate作为Http请求的工具类,简化了很多操作,虽然Spring5推出了WebClient,但是整体感觉还是RestTemplate用起来更简单方便一些,需要的朋友可以参考下
    2023-10-10
  • Java8新特性之默认方法详解

    Java8新特性之默认方法详解

    JAVA8 所提供的默认方法,就是在接口上你可以定义某些方法的实现,下面这篇文章主要给大家介绍了关于Java8新特性之默认方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 关于IntelliJ IDEA 打包代码报错的问题

    关于IntelliJ IDEA 打包代码报错的问题

    这篇文章主要介绍了关于IntelliJ IDEA 打包代码报错的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java语言之LinkedList和链表的实现方法

    Java语言之LinkedList和链表的实现方法

    LinkedList是由传统的链表数据结构演变而来的,链表是一种基本的数据结构,它可以动态地增加或删除元素,下面这篇文章主要给大家介绍了关于Java语言之LinkedList和链表的实现方法,需要的朋友可以参考下
    2023-05-05
  • 简单实现Java通讯录系统

    简单实现Java通讯录系统

    这篇文章主要为大家详细介绍了如何简单实现Java通讯录系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 详解springcloud组件consul服务治理

    详解springcloud组件consul服务治理

    Consul是一款由HashiCorp公司开源的,用于服务治理的软件,Spring Cloud Consul对其进行了封装,这篇文章主要介绍了springcloud组件consul服务治理,需要的朋友可以参考下
    2022-08-08
  • java高并发下解决AtomicLong性能瓶颈方案LongAdder

    java高并发下解决AtomicLong性能瓶颈方案LongAdder

    这篇文章主要为大家介绍了java高并发下解决AtomicLong性能瓶颈方案LongAdder,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java中将bean放入Spring容器中的几种方式详解

    Java中将bean放入Spring容器中的几种方式详解

    这篇文章主要介绍了Java中将bean放入Spring容器中的几种方式详解,在Spring框架中,有多种方式可以将Bean(即对象)放入Spring容器中,今天我们就来详细说一下这几种方式,需要的朋友可以参考下
    2023-07-07
  • springboot多模块项目mvn打包遇到存在依赖但却无法发现符号问题

    springboot多模块项目mvn打包遇到存在依赖但却无法发现符号问题

    在SpringBoot多模块项目中,如果遇到依赖存在但无法发现符号的问题,常见原因可能是pom.xml配置问题,例如,如果某个模块仅作为依赖而不是启动工程,不应在其pom中配置spring-boot-maven-plugin插件,因为这将影响jar包的生成方式
    2024-09-09

最新评论