首页 > 解决方案 > ThreadPoolTask​​Scheduler 在运行时更改 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。我该怎么做?

标签: javamultithreadingscheduled-tasksschedulertaskscheduler

解决方案


根据文档,您可以通过调用 setPoolSize() 在运行时调整调度程序的大小(请参阅:https ://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTask​​Scheduler .html#setPoolSize-int- )

问题是:您需要引用特定的类ThreadPoolTaskScheduler而不是 interface TaskScheduler

您需要决定是否要将引用从 更改TaskSchedulerThreadPoolTaskScheduler而不破坏代码中的任何内容


推荐阅读