我们的应用程序正在使用Spring @Async启动异步任务(例如,对REST API进行并行调用)。我们的ThreadPoolTaskExecutor已配置为16 corepoolsize,128 maxpool和128队列大小。
异步任务可以启动更多异步任务,依此类推,这些任务可以嵌套得很深。有了足够多的并发请求,加上称为REST API的响应时间很慢,我们很容易陷入僵局。 corepool中的所有任务都在等待队列中子任务的结果。由于核心池已满,队列中的子任务将不会执行。因此陷入僵局。
输出异步方法如下所示:
@Async
public Future<String> asyncCallAPI() {
return new AsyncResult<>(callAPI());
}
避免这些死锁的最佳方法是什么?