如何将计划任务分配给特定线程?

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>

是否可以创建两个不同的线程(T1T2)并分配第一组计划任务在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(...);