JAVA有什么办法让定时停止,java通过接口开启和停止定时任务

1.思路说明

(a)首先这里我们需要重新认识一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度。

(b)ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)

(c)在ScheduledFuture中有一个cancel可以停止定时任务。

代码解析;

根据以上的思路分析,我们很容易就知道如何进行编码了,先提供代码如下:

#web接口调用

package com.mlchain.strategy.web;

import com.mlchain.strategy.entity.Result;

import com.mlchain.strategy.quart.ExecutePro;

import com.mlchain.strategy.utils.ResultUtil;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import org.springframework.scheduling.support.CronTrigger;

import org.springframework.stereotype.Component;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

import java.util.concurrent.ScheduledFuture;

@Slf4j

@Component

@RestController

@RequestMapping("/api/task")

public class TaskController {

@Autowired

private ThreadPoolTaskScheduler threadPoolTaskScheduler;

private ScheduledFuture> future;

@Bean

public ThreadPoolTaskScheduler threadPoolTaskScheduler() {

return new ThreadPoolTaskScheduler();

}

@PostMapping("/start")

public Result start(@RequestBody Map requestMap){

try{

//每小时过一分执行策略 整点是采集数据的

future = threadPoolTaskScheduler.schedule(new ExecutePro(), new CronTrigger("0 1 0-23 * * ? "));

log.info("策略已经启动");

return ResultUtil.success();

}catch (Exception e){

log.error("策略启动失败{}",requestMap);

return ResultUtil.error(500,"策略启动失败!");

}

}

@PostMapping("/stop")

public Result stop(@RequestBody Map requestMap){

try{

if (future != null) {

future.cancel(true);

}

log.info("策略已经停止");

return ResultUtil.success();

}catch (Exception e){

log.error("策略停止失败{}",requestMap);

return ResultUtil.error(500,"策略停止失败!");

}

}

}

#需要执行的定时任务

@Slf4j

@Component

public class ExecutePro implements Runnable {

@Override

public void run() {

System.out.println("我在启动中");

······

(a)我们首先了一个类DynamicTask;

(b)定义了两个变量,threadPoolTaskScheduler和future 其中future是treadPoolTaskScheduler执行方法schedule的返回值,主要用于定时任务的停止。

(c)编写启动定时器的方法startCron();

(d)编写停止方法stopCron(),这里编码的时候,需要注意下需要判断下future为null的时候,不然就很容易抛出NullPointerException;

(e)编写修改定时任务执行周期方法changeCron(),这里的原理就是关闭之前的定时器,创新在创建一个新的定时器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值