V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
looveh
V2EX  ›  程序员

多线程怎么入门?

  •  
  •   looveh · 2023-12-26 14:46:19 +08:00 · 3829 次点击
    这是一个创建于 369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是一个培训机构出来的 Java 开发,第一学历高中。不怕大家笑话,工作 6 ,,7 年了感觉自己对多线程还是似懂非懂的状态。有没有大佬能教一下多线程应该怎么入门啊?什么时候该用多线程提升性能?什么情况下该用锁?什么情况下不需要用锁?我心里一点没底。

    37 条回复    2023-12-27 13:56:34 +08:00
    emSaVya
        1
    emSaVya  
       2023-12-26 14:50:14 +08:00
    java 可以看看 Java Concurrency in Practice
    laaaaaa
        2
    laaaaaa  
       2023-12-26 15:01:14 +08:00
    看看 Netty 吧,先看它解决什么问题,在模拟场景去实战
    murmur
        3
    murmur  
       2023-12-26 15:03:22 +08:00   ❤️ 2
    写点什么秒杀、支付、库存之类的就明白了,虽然秒杀也写烂了但是大并发秒杀+库存还是很考验人的

    其实现在的大公司也不会写严格的锁,性能太差了,超售直接砍单就完了,pdd 那么砍单不一堆人还是吹
    jonasjiang23
        4
    jonasjiang23  
       2023-12-26 15:05:14 +08:00
    主要是你没什么应用场景,所以不知道怎么入门;
    多去 b 站找到培训视频看看吧,这样以后面试也懂一点
    mawerss1
        5
    mawerss1  
       2023-12-26 15:05:57 +08:00
    找个操作系统的课看看
    jonasjiang23
        6
    jonasjiang23  
       2023-12-26 15:06:30 +08:00
    光是看 Java Concurrency 并发编程,你看了三个章节,可能还是有点迷糊,到底什么业务场景要用并发;
    looveh
        7
    looveh  
    OP
       2023-12-26 15:52:09 +08:00
    @jonasjiang23 说的挺对,就是没有业务场景。不知道怎么实现
    looveh
        8
    looveh  
    OP
       2023-12-26 15:52:20 +08:00
    @mawerss1 要到这么底层么
    looveh
        9
    looveh  
    OP
       2023-12-26 15:52:41 +08:00
    @emSaVya 有电子书么
    heiya
        10
    heiya  
       2023-12-26 17:43:31 +08:00
    我的建议是从操作系统共享变量、锁那块看起,理解之后看《 Java 并发编程实践》
    NewYear
        11
    NewYear  
       2023-12-26 17:45:14 +08:00
    楼上说的秒杀的场景,其实可以顺序入库,但是不直接返回数据,过几秒显示结果,确定每个用户下单的顺序,然后删掉额外的就可以了,也不会影响用户体验。

    电商的库存这块不是很好弄,但是看需求吧,例如说是以下单为准,还是要以付款为准,付款的时间限制又是什么。
    looveh
        12
    looveh  
    OP
       2023-12-26 19:48:33 +08:00
    @heiya 操作系统听着就感觉好大好难的样子😰
    nice2cu
        13
    nice2cu  
       2023-12-26 19:50:30 +08:00
    公司数据量大、业务稍微复杂点的话,多线程还是很常见的呀
    sjtulyj
        14
    sjtulyj  
       2023-12-26 19:56:50 +08:00
    rust 中的多线程根本就不需要学
    looveh
        15
    looveh  
    OP
       2023-12-26 19:57:17 +08:00
    @nice2cu 没碰到过😂之前做企业福利,也是类似电商都没碰到过
    chenqh
        16
    chenqh  
       2023-12-26 20:03:15 +08:00
    @murmur 难道不是超售就超售吗?双 11 哪个商店敢拒绝阿里的超售需求呢
    kingwrcy
        17
    kingwrcy  
       2023-12-26 20:08:45 +08:00
    业务场景自己随便造一个不就有了?
    比如某接口是个聚合统计接口,依赖外部 10 个接口的数据。
    现在需要你并发 10 个线程异步获取外部 10 个接口的数据。
    拿到全部的 10 个结果后,对结果做加工,入库。

    如果你单线程,那就耗时很久,如果多线程,如何控制 10 个线程全部结束再执行你的后续代码。
    这个就是一个非常基础的多线程场景。

    再比如跑批任务,每天需要对 100 万数据进行清洗,单线程清洗,可能一天都跑不完,需要多线程跑。
    那问题来了,如果让每个线程只负责其中一部分数据,涉及到数的分而治之,并且全部清洗完完成后还要执行后续逻辑。
    这也是个非常基础的多线程场景。
    guo4224
        18
    guo4224  
       2023-12-26 20:09:38 +08:00 via iPhone
    买本 apue 翻翻
    wniming
        19
    wniming  
       2023-12-26 20:19:37 +08:00
    wangkun025
        20
    wangkun025  
       2023-12-26 20:22:35 +08:00
    握手啊。
    我也不懂。
    zapper
        21
    zapper  
       2023-12-26 20:23:59 +08:00   ❤️ 1
    多线程你不一定要用 java 啊。找个什么 python 多线程跑个下载任务或者爬虫玩玩。一上来就锁来锁去的反而更不明白了
    looveh
        22
    looveh  
    OP
       2023-12-26 20:43:06 +08:00
    @zapper python 我语法都不会😭
    giter
        23
    giter  
       2023-12-26 20:46:23 +08:00
    @looveh #8 多线程涉及到挺多《操作系统》这本书里的内容的,考研 408 的书都挺重要
    siweipancc
        24
    siweipancc  
       2023-12-26 22:19:23 +08:00 via iPhone
    写个玩具,爬 e 站的本子
    1. 要求打满带宽
    2. 输出统计数据到文档
    3. 实时显示任务完成占比
    wlm201219
        25
    wlm201219  
       2023-12-26 22:28:21 +08:00
    @siweipancc 放过 e 站吧,换个没良心的网站练手
    kneo
        26
    kneo  
       2023-12-26 22:28:46 +08:00 via Android
    一个多线程有什么学不明白的?随便入门书或者教程读一遍抄一遍代码不就完了?我看你就是懒。
    xrzxrzxrz
        27
    xrzxrzxrz  
       2023-12-26 22:30:24 +08:00
    @heiya 同意,我觉得不是业务的问题。是基础的问题。把操作系统学一下,理解系统是怎么运行的,就能理解多线程这些。
    shawnsh
        28
    shawnsh  
       2023-12-26 22:31:05 +08:00 via Android
    跟培训和学历有个锤子关系,想学基本概念就看操作系统。想速成就搜索相关的书籍。
    cyanray
        29
    cyanray  
       2023-12-27 04:43:37 +08:00   ❤️ 1
    《操作系统导论》作者: [美] Remzi H. Arpaci-Dusseau / [美] Andrea C. Arpaci-Dusseau 出版社: 人民邮电出版社
    这本书写的很好,也没有翻译腔。不推荐看别人的项目说明、博客笔记来学习这些比较基础的东西,会错过很多细节。
    lyxxxh2
        30
    lyxxxh2  
       2023-12-27 09:36:22 +08:00
    你只是要用多线程 问 gpt 直接用
    别看什么底层书籍
    8355
        31
    8355  
       2023-12-27 10:06:48 +08:00
    1.你需要实现一个中台接口,并行调用内部和外部多和接口并将接口返回值进行拼接返回。理论上要求你接口的响应时间略高于响应时间最长接口的时间。
    2.前台有一个接口接收第三方的回调数据存入数据表,你需要在后台脚本尽可能的实时扫表处理每条数据,要求是不能重复处理,需要准实时处理。
    3.大批量发送站内信/app push/短信/邮件
    4.excel 导入大表,高效清洗组装数据入库
    5.电商系统风控模型,需要根据用户行为/下单/登陆/历史订单/地址/支付等多种信息判断该订单是否需要风控拦截。
    heiya
        32
    heiya  
       2023-12-27 10:08:11 +08:00
    @looveh 学起来不难,市面上有关的书籍很多,知识都比较固定,这也是必须要学的。学完之后对理解多线程很有帮助。然后在这个基础上学《 Java 并发编程实践》。
    looveh
        33
    looveh  
    OP
       2023-12-27 13:23:08 +08:00
    @kneo 这个总结的好,不过确实是我的痛点
    looveh
        34
    looveh  
    OP
       2023-12-27 13:24:21 +08:00
    @8355 我之前设计一个消息推送的服务就是类似第 3 点,但是用到了消息队列。多线程方面好像没用。
    looveh
        35
    looveh  
    OP
       2023-12-27 13:24:58 +08:00
    @heiya 我感觉好难啊,特别是文字较多的话我看着看着就要睡觉。纸质书籍基本看不下去
    looveh
        36
    looveh  
    OP
       2023-12-27 13:26:36 +08:00
    @kingwrcy 你这种的话我倒是之前用 Java 的 CompletedFeature 实现过,有个接口有很多个统计。但是虽然用了,万一出现问题甚至都不知道原因是啥
    8355
        37
    8355  
       2023-12-27 13:56:34 +08:00
    @looveh #34 如果不用消息队列如何处理,就是单表查数据如何更平均高效的并行处理,这个才是你想了解的问题核心吧,假设有 2 台机器提供部署,每个应用启动 10 个线程,20 个线程该如何均匀的处理 100 万条消息以达到最快的处理速度,并且不重复处理。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2583 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:21 · PVG 23:21 · LAX 07:21 · JFK 10:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.