ThreadPoolTaskScheduler的使用,定时任务开启与关闭
ThreadPool
A simple C++11 Thread Pool implementation
项目地址:https://gitcode.com/gh_mirrors/th/ThreadPool
免费下载资源
·
https://www.52zyfxw.com
这里用的是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
GitHub 加速计划 / th / ThreadPool
7.74 K
2.22 K
下载
A simple C++11 Thread Pool implementation
最近提交(Master分支:2 个月前 )
9a42ec13 - 9 年前
fcc91415 - 9 年前
更多推荐
已为社区贡献1条内容
所有评论(0)