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

时间:2020-05-29 13:24:13

标签: java spring multithreading spring-boot scheduled-tasks

同事,我有一组预定的任务。在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线程中分配要执行的第一组计划任务,而在{{ 1}}线程?

我不能仅仅在T2中增加PoolSize,因为TaskScheduler任务将在不同的线程中执行,因此不适合业务流程。

如果有任何建议和帮助,我将不胜感激。

1 个答案:

答案 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(...);