长连接中异步任务的同步等待陷阱:一次主线程阻塞的排查与修复

最近的项目出现了一个bug,长连接中使用了异步线程池,具体是有一个循环,每一次循环都用了异步线程,然后呢,在长连接中处理这个循环的同时,还会有前端向后端发送消息,那么后端也要接收相应的消息进行处理,每次循环的异步线程如下

java 复制代码
Future<Boolean> submit = taskExecutor.submit(new Callable<Boolean>() {
                @Override
                public Boolean call(){}
                });

然后呢还搞了一个

java 复制代码
private final Map<String, Future<Boolean>> Futures = new ConcurrentHashMap<>();
Futures.put(id, submit);

以id为key保存每一次循环中的异步线程返回值,然后呢,最灵魂的代码来喽,这句代码真是给添了不少麻烦,那就是等待这次异步任务完成,实际上大错特错

java 复制代码
Future<Boolean> future = Futures.get(id);
Boolean b = future.get();

这句代码乍一看倒是没什么问题,但是呢,在运行的时候,前端向后端发送特定的消息,后端没有响应,哇靠,这是为啥嘞?

没错,就是Boolean b = future.get();把主线程给阻塞了,导致不能处理其他问题,其实这只是一个小问题哈,但是有时候往往是小问题在写代码的时候,加着加着就忘记了,结果排查的时候好半天才看到。

最后的解决办法是啥呢,最后搞了一个异步线程处理这个循环,大致的代码示意如下:

java 复制代码
 CompletableFuture.runAsync(()->
    {
        for (dto:list) {
            Future<Boolean> submit = taskExecutor.submit(new Callable<Boolean>() {
                @Override
                public Boolean call() {
                }
            });
        }
    })
相关推荐
你住过的屋檐16 小时前
【Java】虚拟线程详解
java·开发语言
逍遥德16 小时前
Maven教程.02-基础-pom.xml 使用标签大全
java·后端·maven·软件构建
甲枫叶16 小时前
【claude热点资讯】Claude Code 更新:手机遥控电脑开发,Remote Control 功能上线
java·人工智能·智能手机·产品经理·ai编程
额,不知道写啥。16 小时前
P5354 [Ynoi Easy Round 2017] 由乃的 OJ
java·开发语言·算法
让我上个超影吧16 小时前
消息队列——RabbitMQ(高级)
java·rabbitmq
得物技术17 小时前
Sentinel Java客户端限流原理解析|得物技术
java·后端·架构
PM老周17 小时前
2026年软硬件一体化项目管理软件怎么选?多款工具对比测评
java·安全·硬件工程·团队开发·个人开发
小扎仙森17 小时前
关于阿里云实时语音翻译-Gummy推送WebSocket
websocket·阿里云·云计算
一只大袋鼠17 小时前
并发编程(三):线程快照统计・grep+awk+sort+uniq 实战详解
java·开发语言·多线程·并发编程
unfeeling_17 小时前
Tomcat实验
java·tomcat