Async 线程耗尽排查:Future.get() 阻塞导致雪崩?队列限制 + 降级回调机制
一、问题背景:线程池耗尽的"死亡螺旋" 你是否遇到过这样的场景:系统使用 @Async 异步执行任务,在流量高峰期突然出现大量请求超时,最终导致整个服务不可用? 这很可能是 Future.get() 阻塞导致的线程池雪崩。当异步任务的处理速度跟不上请求速度时,任务会在队列中堆积,而调用线程在 Future.get() 处阻塞等待,最终导致调用线程也被耗尽。 // 危险的异步调用方式 @Async public CompletableFuture<String> doAsyncTask() { // 执行耗时操作... } // 调用方 public void process() { CompletableFuture<String> future = asyncService.doAsyncTask(); String result = future.get(); // 阻塞等待,可能导致线程耗尽 } 真实案例:某支付系统在双十一期间,异步对账任务因数据库慢查询导致处理延迟,调用线程在 Future.get() 处阻塞,最终导致 Tomcat 线程池被占满,新....