同事,我有一组预定的任务。在spring-boot属性文件中,它看起来像:
group1.task1.run = <execute every first minute>
group1.task2.run = <execute every second minute>
group2.task1.run = <execute every first minute>
group2.task2.run = <execute every second minute>
是否可以创建两个不同的线程(T1
和T2
),并在T1
线程中分配要执行的第一组计划任务,而在{{ 1}}线程?
我不能仅仅在T2
中增加PoolSize
,因为TaskScheduler
任务将在不同的线程中执行,因此不适合业务流程。
如果有任何建议和帮助,我将不胜感激。
答案 0 :(得分:2)
据我所知,不可能指定单个线程。但是,您可以指定用于计划任务的Executor
。如果您不想在同一个线程中执行任务,只需创建一个包含单个线程的线程池,就像这样:
@Configuration
@EnableAsync
@EnableScheduling
public class TempConfig {
@Scheduled(fixedRate = 1000)
@Async(value = "threadPool1")
public void task1() {
System.out.println("Task1: " + Thread.currentThread());
}
@Scheduled(fixedRate = 1000)
@Async(value = "threadPool2")
public void task2() {
System.out.println("Task2: " + Thread.currentThread());
}
@Bean
public Executor threadPool1() {
return Executors.newFixedThreadPool(1);
}
@Bean
public Executor threadPool2() {
return Executors.newFixedThreadPool(1);
}
}
当然,您也可以自己安排任务:
var s1 = Executors.newScheduledThreadPool(1);
var s2 = Executors.newScheduledThreadPool(1);
// schedule tasks of group1
s1.scheduleWithFixedDelay(...);
s1.scheduleWithFixedDelay(...);
// schedule tasks of group2
s2.scheduleWithFixedDelay(...);
s2.scheduleWithFixedDelay(...);