如何将计划任务分配给特定线程?
How to assign scheduled tasks to a specific thread?
同学们,我有一组任务安排好了。在 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
线程中执行,第二组在T2
个线程?
我不能只在TaskScheduler
中增加PoolSize
因为之后group1
任务将在不同的线程中执行,它不适合业务流程。
如有任何建议和帮助,我将不胜感激。
据我所知,不可能指定单个线程。但是,您可以指定应该用于安排任务的 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(...);
同学们,我有一组任务安排好了。在 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
线程中执行,第二组在T2
个线程?
我不能只在TaskScheduler
中增加PoolSize
因为之后group1
任务将在不同的线程中执行,它不适合业务流程。
如有任何建议和帮助,我将不胜感激。
据我所知,不可能指定单个线程。但是,您可以指定应该用于安排任务的 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(...);