ThreadPoolTask​​Scheduler在运行时更改poolSize

时间:2018-09-04 12:57:25

标签: java multithreading scheduled-tasks scheduler taskscheduler

我创建调度程序:

@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 secon上,我有完整的threadPool并等待第一个空闲线程。如果设置sleep(5000L)-thr​​eadPool无法填充。

但是现在我需要在运行时更改poolSize。例如从5到10。我该怎么办?

1 个答案:

答案 0 :(得分:0)

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

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

您需要确定是否要将引用从TaskScheduler更改为ThreadPoolTaskScheduler,而又不会破坏代码中的内容