首页 > 解决方案 > 如何将计划任务分配给特定线程?

问题描述

同事们,我有一组已安排好的任务。在 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线程中执行?

我不能只是增加PoolSizeTaskScheduler因为group1任务将在不同的线程中执行,它不适合业务流程。

我将不胜感激任何建议和帮助。

标签: javaspringmultithreadingspring-bootscheduled-tasks

解决方案


据我所知,不可能指定单个线程。但是,您可以指定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(...);

推荐阅读