JAVA发送HTTP同步请求和异步请求
同步请求:每一次执行httpClient.execute方法时都是阻塞的,必须等待到响应才能继续往下走。
CloseableHttpClient httpClient = HttpClients.createDefault();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
HttpGet httpGet = new HttpGet("https://www.baidu.com");
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
int code = response.getStatusLine().getStatusCode();
if (code == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);//获得结果
System.out.println("第" + i + "次请求完成");
}
}
}
异步请求:httpClient.execute不阻塞,而是立即返回,执行结果由FutureCallback回调处理,而这个回调在另一个线程中。
发送http请求的这2中模式都有应用场景。在请求量少的场景下,异步并不能体现优势,反而会使代码过于复杂难以维护。 在请求并发量巨大的场景下,异步是不二的选择,比如开发压测工具,同步模式肯定无法胜任,开再多的线程也不行,请求根本发不出去,因为线程都被等待响应的过程占用了,机器性能发挥不出来。
CloseableHttpAsyncClient httpClient = HttpAsyncClients.createDefault();
httpClient.start();
for (int i = 0; i < 100; i++) {
HttpGet httpGet = new HttpGet("https://www.baidu.com");
httpClient.execute(httpGet, new FutureCallback<HttpResponse>() {
@Override
public void completed(HttpResponse response) {
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
try {
String result = EntityUtils.toString(entity);//获得结果
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void failed(Exception e) {
}
@Override
public void cancelled() {
}
});
}
原文地址:https://zhuanlan.zhihu.com/p/373732960?ivk_sa=1024609v