java - ThreadPoolTaskScheduler 在运行时更改 poolSize
问题描述
我创建调度程序:
@Bean
TaskScheduler taskScheduler(){
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5);
threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
threadPoolTaskScheduler.setThreadNamePrefix("Test-");
return threadPoolTaskScheduler;
}
我等下:
每 1 秒触发我的预定方法并启动 5 个线程(PoolSize(5)
),每个线程将构成我的逻辑。为此,我在 @Component bean 中创建了计划的方法:
@Slf4j
@Component
public class MyScheduler {
private final TaskScheduler taskScheduler;
public MyScheduler(TaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
}
@Scheduled(fixedDelay = 1000L)
public void test(){
taskScheduler.schedule(() -> {
try {
Thread.sleep(9000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("test");
}, new Date());
}
}
它工作正常。
每1秒启动test()
方法,工作9秒。在 5 秒,我有完整的线程池并等待第一个空闲线程。如果我设置sleep(5000L)
-threadPool 不能填满。
但现在我需要在运行时更改 poolSize 。例如从 5 到 10。我该怎么做?
解决方案
根据文档,您可以通过调用 setPoolSize() 在运行时调整调度程序的大小(请参阅:https ://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskScheduler .html#setPoolSize-int- )
问题是:您需要引用特定的类ThreadPoolTaskScheduler
而不是 interface TaskScheduler
。
您需要决定是否要将引用从 更改TaskScheduler
为ThreadPoolTaskScheduler
而不破坏代码中的任何内容
推荐阅读
- php - 如何使用字段数组作为查询更新 Mongo 集合
- eiffel - 埃菲尔:正则表达式如何进行分组
- mysql - 是否仅通过事务对数据库进行更改?
- sql - 在两个字符串之间选择字符串
- ios - IOS/Swift/AVSpeechSynthesizer:控制排队话语的速度
- python - 删除 python2.7 后 mkvirtualenv 不工作
- love2d - 在 Love2D 中调用(导入)main.lua 之外的其他 .lua 文件
- angular - 无法在 combineLatest 上进行管道传输
- c - 无法获得正确的 Linux 内核头文件来构建内核模块
- java - 为什么使用 junit-jupiter (聚合器)执行测试而不使用单独的依赖项?