parallelStream () + ThreadLocal
lyAuditResourcePOList = lyAuditResourceDTOList.parallelStream() .map(LyAuditResourceTransfer::lyAuditResourceDTO2LyAuditResourcePO) .collect(Collectors.toList());
核心原因:parallelStream () 是多线程!
而你的 TokenUtil 用的是 ThreadLocal!
一句话原理
ThreadLocal = 只能在【当前线程】取值parallelStream = 自动开多个新线程
👉 主线程存了 Token👉 子线程(并行流)完全拿不到!👉 所以 TokenUtil.getCurrentUserId() = null
为什么普通 stream () 可以,parallelStream () 不行?
list.stream() // 单线程,和调用方同一个线程 → 能拿到 list.parallelStream() // 多线程,新开线程 → 拿不到!
解决方案(2 选 1,立刻解决)
方案 1:最简单 → 把 parallelStream () 改成 stream ()
99% 业务不需要并行流,直接改单线程流就好
lyAuditResourcePOList = lyAuditResourceDTOList.stream() .map(LyAuditResourceTransfer::lyAuditResourceDTO2LyAuditResourcePO) .collect(Collectors.toList());
✅ 立刻就能拿到 Token!
方案 2:必须用并行流?→ 提前把 Token 取出来传进去
不要在 lyAuditResourceDTO2LyAuditResourcePO 里面取 Token!外面先取,再传进去!
// 1. 主线程先拿到 String userId = TokenUtil.getCurrentUserId(); String userName = TokenUtil.getCurrentUserName(); // 2. 传给转换方法 lyAuditResourcePOList = lyAuditResourceDTOList.parallelStream() .map(dto -> LyAuditResourceTransfer.lyAuditResourceDTO2LyAuditResourcePO(dto, userId, userName)) .collect(Collectors.toList());
✅ 这样多线程也不会丢!
终极总结(你只要记住这句)
只要看到 parallelStream () + ThreadLocal,一定拿不到值!parallelStream 是多线程,ThreadLocal 是线程隔离,天生不兼容!
更多推荐


所有评论(0)