7

你能告诉我 Spring 的默认参数是什么,@Async ThreadPoolTaskExecutor或者我如何找到自己的参数?

maxPoolSize、corePoolSize 和 queueCapcity 的默认值是多少?

我应该重写它们以改进我的应用程序还是使用默认值就可以了?

4

5 回答 5

5

关于ThreadPoolTaskExecutor的实施。您可以在他们的 github 存储库中查看它。线程池任务执行器

private int corePoolSize = 1;

private int maxPoolSize = Integer.MAX_VALUE;

private int queueCapacity = Integer.MAX_VALUE;
于 2019-09-18T08:38:26.763 回答
5

我假设您想使用@EnableAsync( javadoc ) 注释来支持 spring 中的异步任务执行。

在这种情况下,文档说明了以下内容:

默认情况下,Spring 将搜索关联的线程池定义:要么org.springframework.core.task.TaskExecutor是上下文中唯一的 bean,要么是java.util.concurrent.Executor名为“taskExecutor”的 bean。

如果两者都不可解析,则 aorg.springframework.core.task.SimpleAsyncTaskExecutor将用于处理异步方法调用。

现在,如果您想提供自己的定制,您可以定义(实现)一个AsyncConfigurerjavadoc),它基本上允许定义一个执行程序和异常处理程序(超出此问题的范围)。

于 2019-09-18T08:41:19.483 回答
1

根据 Spring 源@EnableAsync注释,实际配置SimpleAsyncTaskExecutor并且不重用线程,并且在任何时候使用的线程数默认情况下不受限制。

在提交作业的进程和线程池之间有一个队列。如果所有线程都被占用,则作业将被排队。如果队列已满且线程也被占用,则新任务将被拒绝。您可以选择几种拒绝策略(例如,呼叫者运行)。

如果您正在寻找真正的池化,请查看SimpleThreadPoolTaskExecutorThreadPoolTaskExecutor

于 2019-09-18T09:08:43.873 回答
1

我认为您需要@EnableAsync启用@Async注释,并且此注释将使用默认实现SimpleAsyncTaskExecutor

SimpleAsyncTaskExecutor实现不重用任何线程,而是为每次调用启动一个新线程。但是,它确实支持并发限制,该限制将阻止任何超过限制的调用,直到插槽被释放。

你可以定义自己的ThreadPoolTaskExecutor喜欢

@Configuration
public class ThreadConfig {

    @Bean("otherExecutor")
    public TaskExecutor threadPoolTaskExecutor() {

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(16);
        executor.setMaxPoolSize(32);
        executor.initialize();

        return executor;
    }
}

并在@Async

@Async("otherExecutor")
void doSomething(String s) {
    // this will be executed asynchronously by "otherExecutor"
}

于 2021-08-15T11:44:55.203 回答
0

@Async 使用的任务执行器的 bean 名称是applicationTaskExecutor

的属性applicationTaskExecutor定义在TaskExecutionProperties

private int queueCapacity = Integer.MAX_VALUE;
private int coreSize = 8;
private int maxSize = Integer.MAX_VALUE;
于 2021-07-15T14:20:59.940 回答