各位彦祖, Java 多线程问题请教

2021-07-29 20:18:26 +08:00
 fadedos

java 多线程问题请教

问题描述:

  1. http 请求到后台,一个 list 数据到后台,返回结果的实时性要求比较高
  2. list 中多条明细,需要根据一定的规则进行筛选 ,比较耗时很久,此处想采用多线程优化
  3. 关键点: 在筛选过程中, 子线程的筛选规则需要查询 表 C 和表 D; 获得值
  4. 筛选 ok,得到值,会添加到明细中,然后分别会落四张表,表 A,表 B,表 C,表 D
  5. 关键点 2: 只要一条明细插入失败,所有的记录进行回滚
1428 次点击
所在节点    Java
7 条回复
xuanbg
2021-07-29 20:56:47 +08:00
貌似没有返回什么结果啊???这样开个新的线程慢慢写或者丢进消息队列异步处理就好了,都是立马就能返回成功的。
fadedos
2021-07-29 21:04:06 +08:00
@xuanbg 返回结果: 各条明细筛选出来的值, 会放在 list 中,再次给前台
放到消息队列中, 错了一个怎么回滚呢?
clickhouse
2021-07-29 21:42:26 +08:00
看 2 说的,你想多线程优化的只是筛选,那么多线程筛选即可,反正只查表。“一条明细插入失败,所有的记录进行回滚”不就是正常的事务嘛。
fadedos
2021-07-29 21:52:25 +08:00
@clickhouse
目前情况:
1.子线程查询筛选,在查表 C,表 D 时候,会发生锁表,导致子线程一直等待
2. 落表 A,B,C,D 是在 main 线程 (接手别人的代码)

改良思路:
1. 将落表逻辑提到子线程中,各个明细只管自己

想到的问题:
1. 一个线程失败,其他线程有插入成功, 这个整体回滚怎么做?
DreamSpace
2021-07-29 23:14:50 +08:00
list.parallelStream() 最后 reduce 成一个 Map<String,List<?>>,遍历 Map 批量插入
fadedos
2021-07-30 00:05:43 +08:00
@DreamSpace 能详细说说嘛? 这个流,直接在 main 线程使用? 写 java 写的少
BQsummer
2021-07-30 10:08:29 +08:00
@fadedos 多线程事务用注解实现不了吧,得手写吧,难度立马大了很多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/792551

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX