zoukankan      html  css  js  c++  java
  • ThreadPoolTaskScheduler的使用,定时任务开启与关闭

    这里用的是Springboot框架。进行测试开发的,其实都是一样的。只不过这样比较方便测试。

    利用定时线程池任务调度,多利模式,

    定点查询任务,开启或关闭简单案例,如果任务有需求,那么就拼接cron表达式,传入定时任务即可。

    
    /**
     * @author: Licl
     **/
    @Component
    @Scope("prototype")
    public class DynamicTask {
    
        private final static Logger logger = LoggerFactory.getLogger(DynamicTask.class);
        private String cron;
        @Autowired
        private ThreadPoolTaskScheduler threadPoolTaskScheduler;
        private ScheduledFuture future;
    
        public void startCron() {
            cron = "0/1 * * * * ?";
            System.out.println(Thread.currentThread().getName());
            String name = Thread.currentThread().getName();
            future = threadPoolTaskScheduler.schedule(new myTask(name), new CronTrigger(cron));
            App.map.put(name, future);
        }
    
        public void stop() {
            if (future != null) {
                future.cancel(true);
            }
        }
    
        private class myTask implements Runnable {
            private String name;
    
            myTask(String name) {
                this.name = name;
            }
    
            @Override
            public void run() {
                System.out.println("test" + name);
            }
        }
    
    }

    创建一个map用来存储定时任务的回调对象。用于接下来的判断。并且初始化调度的线程池

    @SpringBootApplication
    public class App {
        // 线程存储器
    	public static ConcurrentHashMap<String, ScheduledFuture> map = new ConcurrentHashMap<String, ScheduledFuture>();
        // 启动入口
    	public static void main(String[] args) {
    		SpringApplication.run(App.class, args);
    	}
    
        // 创建线程
    	@Bean
    	public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
    		ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
    		executor.setPoolSize(20);
    		executor.setThreadNamePrefix("taskExecutor-");
    		executor.setWaitForTasksToCompleteOnShutdown(true);
    		executor.setAwaitTerminationSeconds(60);
    		return executor;
    	}
    
    }
    

    接下来进入测试方法,查看是否可以进行定时任务的定点停止。

    设定一个线程名称,进行模拟。以后部署在项目中可以是动态的。

    /**
     * @author: Licl
     * @Description: 测试类
     **/
    @RestController
    public class Test {
    
    	@Autowired
    	private DynamicTask task;
    	@RequestMapping("/task")
    	public void test() throws Exception {
    	    // 开启定时任务,对象注解Scope是多利的。
    		task.startCron();
    
    	}
    	@RequestMapping("/stop")
    	public void stop() throws Exception {
    	    // 提前测试用来测试线程1进行对比是否关闭。
            ScheduledFuture scheduledFuture = App.map.get("http-nio-8081-exec-1");
            scheduledFuture.cancel(true);
            // 查看任务是否在正常执行之前结束,正常true
            boolean cancelled = scheduledFuture.isCancelled();
            while (!cancelled) {
                scheduledFuture.cancel(true);
            }
        }
    }

    方法调用分析。测试log

  • 相关阅读:
    【BZOJ-1507】Editor 块状链表
    【BZOJ-4456】旅行者 分治 + 最短路
    【BZOJ-3262】陌上花开 CDQ分治(3维偏序)
    【BZOJ-1176&2683】Mokia&简单题 CDQ分治
    【BZOJ-1962】模型王子 DP 猜数问题
    【BZOJ-3786】星系探索 Splay + DFS序
    【BZOJ-1552&3506】robotic sort&排序机械臂 Splay
    【BZOJ-4688】One-Dimensional 矩阵乘法
    【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)
    Java中接口式的匿名内部类的构造方法
  • 原文地址:https://www.cnblogs.com/liclBlog/p/15349547.html
Copyright © 2011-2022 走看看