V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
MakHoCheung
V2EX  ›  问与答

关于 Java 的异步 HTTP 请求

  •  
  •   MakHoCheung · 2022-01-19 09:51:07 +08:00 · 982 次点击
    这是一个创建于 799 天前的主题,其中的信息可能已经有所发展或是发生改变。

    异步请求指的是发起请求后马上返回等请求到了再去执行回调

    我的疑问是异步请求的实现是不是也有优劣之分

    1. 主线程发起请求,底层是另外开一条线程去执行请求,然后 IO 等待时候该线程挂起,等响应到了再执行回调。缺点是有线程被挂起,多个请求就会有多条线程挂起。
    2. 基于 IO 多路复用,发起请求后在 selector 注册事件,之后只要一条线程轮询事件,响应事件就绪后可以复用轮询的线程或者另外开一条线程来执行回调,全程没有线程挂起。
    • Java11 的自带的 httpclient 库的实现是不是我列的第一种?
    • 第三方基于第二种的 HTTP 库有哪些?
    • servlet 3.0 异步是我说的第一种吗
    • 所谓的协程的底层实现是我说的第二种?
    5 条回复    2022-01-19 13:10:34 +08:00
    javapythongo
        1
    javapythongo  
       2022-01-19 10:14:34 +08:00
    第一种一般有线程池
    lawler
        2
    lawler  
       2022-01-19 10:27:25 +08:00   ❤️ 1
    Java11 的自带的 httpclient 库的实现是不是我列的第一种?
    对,

    第三方基于第二种的 HTTP 库有哪些?
    基于 NIO 的库都是,如 Netty 、Mina 、Vert.x(netty 底座)

    servlet 3.0 异步是我说的第一种吗
    对。

    所谓的协程的底层实现是我说的第二种?
    对。
    MakHoCheung
        3
    MakHoCheung  
    OP
       2022-01-19 11:22:26 +08:00
    @javapythongo 用不用线程池,线程也会挂起
    potatowish
        4
    potatowish  
       2022-01-19 13:03:20 +08:00 via iPhone
    servlet3 是把请求交给线程池来执行,然后请求线程退出,等线程池执行完成返回结果时,再另起一个 servlet 线程处理异步响应
    potatowish
        5
    potatowish  
       2022-01-19 13:10:34 +08:00 via iPhone
    servlet3 并不会让线程挂起,不存在你说的多个请求就会挂起多个线程的情况。它只是让容器线程退出后,响应仍然保持打开的状态。其本身的作用就是让提高 servlet 容器线程的利用率,让请求处理过程和容器线程分离。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1550 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:59 · PVG 07:59 · LAX 16:59 · JFK 19:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.