Spring - 让TaskExecutor和TaskScheduler由相同的线程池支持

时间:2017-02-18 12:31:42

标签: java spring multithreading java.util.concurrent taskscheduler

我是TaskScheduler和TaskExecutor的bean,如下所示:

@Bean
public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler s = new ThreadPoolTaskScheduler();

    s.setThreadNamePrefix("Task-Scheduler-");
    s.setPoolSize(10);
    s.setRemoveOnCancelPolicy(true);

    return s;
}

@Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor e = new ThreadPoolTaskExecutor();

    e.setThreadNamePrefix("Task-Executor-");
    e.setMaxPoolSize(10);
    e.setCorePoolSize(10);

    return e;
}

是否可以在TaskExecutor和TaskScheduler之间共享底层线程池执行器服务?现在我有10个固定线程的两个池,但我希望有一个20个线程的单个池。

这些池将用于@ Async,@ Scheduduled和@Retry annotatons。

1 个答案:

答案 0 :(得分:2)

你不能通过使用这两个类来实现这一点,因为它们是依赖于内部池的实现。

但是,您可以实现自己使用共享ThreadPool的TaskExecutorTaskScheduler类。

请注意,一些空闲线程不会对性能产生太大影响,因此除非您知道有两个池是主要的性能瓶颈,否则我不会浪费时间。