关于 Java 的异步 HTTP 请求

2022-01-19 09:51:07 +08:00
 MakHoCheung

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

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

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

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

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

所谓的协程的底层实现是我说的第二种?
对。
MakHoCheung
2022-01-19 11:22:26 +08:00
@javapythongo 用不用线程池,线程也会挂起
potatowish
2022-01-19 13:03:20 +08:00
servlet3 是把请求交给线程池来执行,然后请求线程退出,等线程池执行完成返回结果时,再另起一个 servlet 线程处理异步响应
potatowish
2022-01-19 13:10:34 +08:00
servlet3 并不会让线程挂起,不存在你说的多个请求就会挂起多个线程的情况。它只是让容器线程退出后,响应仍然保持打开的状态。其本身的作用就是让提高 servlet 容器线程的利用率,让请求处理过程和容器线程分离。

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

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

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

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

© 2021 V2EX