我有个遗嘱执行人,
@Bean("someExecutor")
public Executor someExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("AsyncMethod-");
executor.initialize();
return executor;
}
和异步方法。
@Async("someExecutor")
public Future<List<String>> someMethod(){
return CompletableFuture.supplyAsync(() -> {
//long time job
return listGeneratedByLongTimeJob;
});
}
spring将someexecutor用于somemethod吗?怎么做?
我知道supplyasync(supplier)的重载方法是supplyasync(supplier,executor),下面的代码怎么样?
@Autowired("someExecutor")
private Executor executor;
@Async()
public Future<List<String>> someMethod(){
return CompletableFuture.supplyAsync(() -> {
//long time job
return listGeneratedByLongTimeJob;
}, executor);
}
谢谢。
1条答案
按热度按时间j0pj023g1#
好吧,我们花了一些时间来解决这个问题,在讨论两个场景之前,我们需要讨论一下
ForkJoinPool
来自java.util.concurrent.completablefuturedocs所有没有显式executor参数的异步方法都使用forkjoinpool.commonpool()执行(除非它不支持至少两个并行级别,在这种情况下,将创建一个新线程来运行每个任务)。为了简化监视、调试和跟踪,所有生成的异步任务都是标记接口completablefuture.asynchronouscompletiontask的示例。
所以每次你打电话的时候
CompletableFuture.supplyAsync(Supplier s)
,供应商将由ForkJoinPool
线程,现在让我们开始案例1案例1:
为了说清楚,我补充了一些
sysout
用于打印线程名称的语句输出:
在这种情况下
asyncService()
执行人AsyncMethod-1
螺纹和供应商supplyAsync()
执行人ForkJoinPool
案例2:输出:
在第二种情况下
asyncService()
方法和供应商supplyAsync()
两者都使用someExecutor pool
默认情况下,spring使用simpleasynctaskexecutor实际运行这些命令async
方法,但我们用someExecutor
在配置中使用@EnableAsync
文件默认情况下,spring将搜索关联的线程池定义:上下文中唯一的taskexecutor bean,或者名为“taskexecutor”的executor bean。如果两者都不可解析,则将使用simpleasynctaskexecutor来处理异步方法调用。
注意:如果您没有
@EnableAsync
在config类中,您将得到不同的结果,我将在github中上载此代码并在此处添加链接