MakHoCheung
V2EX  ›  问与答

关于 Java 的异步 HTTP 请求

  •  
  •   MakHoCheung · Jan 19, 2022 · 1805 views
  •   You need to sign in to view this topic
    This topic created in 1707 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    所谓的协程的底层实现是我说的第二种?
    对。
    MakHoCheung
        3
    MakHoCheung  
    OP
       Jan 19, 2022
    @javapythongo 用不用线程池,线程也会挂起
    potatowish
        4
    potatowish  
       Jan 19, 2022 via iPhone
    servlet3 是把请求交给线程池来执行,然后请求线程退出,等线程池执行完成返回结果时,再另起一个 servlet 线程处理异步响应
    potatowish
        5
    potatowish  
       Jan 19, 2022 via iPhone
    servlet3 并不会让线程挂起,不存在你说的多个请求就会挂起多个线程的情况。它只是让容器线程退出后,响应仍然保持打开的状态。其本身的作用就是让提高 servlet 容器线程的利用率,让请求处理过程和容器线程分离。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3870 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:11 · PVG 13:11 · LAX 22:11 · JFK 01:11
    ♥ Do have faith in what you're doing.