java - 如何将计划任务分配给特定线程?
问题描述
同事们,我有一组已安排好的任务。在 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
线程中执行?
我不能只是增加PoolSize
,TaskScheduler
因为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(...);
推荐阅读
- java - bean 的实例化失败;嵌套异常;SpringBoot 和 Vaadin
- php - Yii2 GridView 日期格式的工作原理
- python - 来自detectron2的ValueError导入model_zoo
- prolog - 在 Prolog 中读取文件
- ios - 如何查找 ideviceimagemounter 的变量
- jenkins - 如何编写 Jenkinsfile 管道?
- python - Keras 自动编码器中的输入形状
- tensorflow - 无法在 Windows 上安装 tensorflow-addons
- excel - VBA 中的索引和匹配
- sage - SageMath:matrix_plot 未在子例程中返回任何输出