请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,问您一个多线程更新数据的问题

多线程更新数据的问题,就是一个线程池中我要更新280W的数据,这个线程池固定是 10个线程,

然后每次一个线程执行 更新 500条数据, 那280W / 500 = 5600,然后 for循环5600次,

每次线程池提交一个线程任务,就是上面说的更新500条数据,然后现在存在的问题是由于多线程的环境,

多个线程可能在更新重复的数据,导致最后可能出现少更新了一些数据,按照正常理想的情况下,应该是第一个线程

更新500条数据,第二线程继续更新后面500条数据,以此类推,这样就不会出现漏更新的问题,但是这样不就是

等于排队了,那么用多线程就没意义了,老师有什么方案嘛

正在回答

1回答

张勤一 2020-11-12 17:54:21

三兄弟你好:

    关于你所说的重复数据处理其实是个很简单的问题,问题的难点是对错误的处理。你可以思考 ConcurrentHashMap 的思想,为什么它的效率高呢,因为存在数据分段。那么,其实,你这里的数据就可以采用数据分段的思想:

    (1)每个线程处理 500 个数据,就把数据分成 total / 500 段(hash 取模就可以确定属于哪一段)

    (2)每一段数据都用线程池中的线程去处理,但是这里面在处理每一个 task 的时候,需要 try catch 并保存失败的 task

    (3)汇总失败的 task 并重试处理


    我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!

2 回复 有任何疑惑可以回复我~
  • 提问者 奶茶三兄弟d #1
    如果将数据放在内存中,比如这里的11w,或者大到280w,会不会oom啊
    回复 有任何疑惑可以回复我~ 2020-11-12 20:12:20
  • 张勤一 回复 提问者 奶茶三兄弟d #2
    内存是你在启动 JVM 的时候设置的,不放在内存,从文件里读也是一样的操作过程
    回复 有任何疑惑可以回复我~ 2020-11-12 20:15:44
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信