你能告诉我 Spring 的默认参数是什么,@Async
ThreadPoolTaskExecutor
或者我如何找到自己的参数?
maxPoolSize、corePoolSize 和 queueCapcity 的默认值是多少?
我应该重写它们以改进我的应用程序还是使用默认值就可以了?
你能告诉我 Spring 的默认参数是什么,@Async
ThreadPoolTaskExecutor
或者我如何找到自己的参数?
maxPoolSize、corePoolSize 和 queueCapcity 的默认值是多少?
我应该重写它们以改进我的应用程序还是使用默认值就可以了?
关于ThreadPoolTaskExecutor
的实施。您可以在他们的 github 存储库中查看它。线程池任务执行器
private int corePoolSize = 1;
private int maxPoolSize = Integer.MAX_VALUE;
private int queueCapacity = Integer.MAX_VALUE;
我假设您想使用@EnableAsync
( javadoc ) 注释来支持 spring 中的异步任务执行。
在这种情况下,文档说明了以下内容:
默认情况下,Spring 将搜索关联的线程池定义:要么org.springframework.core.task.TaskExecutor
是上下文中唯一的 bean,要么是java.util.concurrent.Executor
名为“taskExecutor”的 bean。
如果两者都不可解析,则 aorg.springframework.core.task.SimpleAsyncTaskExecutor
将用于处理异步方法调用。
现在,如果您想提供自己的定制,您可以定义(实现)一个AsyncConfigurer
(javadoc),它基本上允许定义一个执行程序和异常处理程序(超出此问题的范围)。
根据 Spring 源@EnableAsync
注释,实际配置SimpleAsyncTaskExecutor
并且不重用线程,并且在任何时候使用的线程数默认情况下不受限制。
在提交作业的进程和线程池之间有一个队列。如果所有线程都被占用,则作业将被排队。如果队列已满且线程也被占用,则新任务将被拒绝。您可以选择几种拒绝策略(例如,呼叫者运行)。
如果您正在寻找真正的池化,请查看SimpleThreadPoolTaskExecutor
和ThreadPoolTaskExecutor
我认为您需要@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"
}
@Async 使用的任务执行器的 bean 名称是applicationTaskExecutor
的属性applicationTaskExecutor
定义在TaskExecutionProperties
private int queueCapacity = Integer.MAX_VALUE;
private int coreSize = 8;
private int maxSize = Integer.MAX_VALUE;