spring boot定时任务中新建线程如何做到可控终止

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wild46cat/article/details/82709996

最近遇到这样的需求,要求是定时的执行任务,但是这些任务能够根据控制及时的停止。

首先定时任务可以直接使用spring中的schedule注解方式实现。那么如何控制已经启动的任务及时停止呢?

下面说一下思路。首先利用spring的schedule注解方式进行定时任务的执行。然后,在每个定时任务中使用新建线程的方式进行任务的执行。在新建线程的run方法中通过检测开关的状态,如果开关开启,则抛出interruptException然后通过catch捕获结束线程的执行即可。

下面是详细的实现。

1、首先在spring boot中添加定时任务。

添加@EnableScheduling注解。

2、添加定时任务

package com.example.demo.task;


import com.example.demo.controller.TaskHelperController;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class TestTask {
    @Scheduled(cron = "0/5 * * * * ?")
    public void test() {
        Thread thread = new Thread(new Exetask());
        thread.start();
        System.out.println(thread.getName() + "===============begin" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
    }

    class Exetask implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                try {
                    if (TaskHelperController.stopFlag) {
                        throw new InterruptedException();
                    }
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName() + "   " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
                } catch (InterruptedException e) {
                    System.out.println(Thread.currentThread().getName() + "  stop!!!");
                    break;
                }
            }
        }
    }

}

3、对应的控制逻辑在另一个接口中

package com.example.demo.controller;

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

@RestController
@RequestMapping("/taskHelper")
public class TaskHelperController {
    public static boolean stopFlag = false;

    @RequestMapping("/change")
    public String test(boolean flag) {
        TaskHelperController.stopFlag = flag;
        return "ok";
    }
}

4、这里的开关标志可以保存在数据库,缓存等地方。

猜你喜欢

转载自blog.csdn.net/wild46cat/article/details/82709996