《HttpClient官方文档》2.4 多线程请求执行

简介:

2.4.多线程请求执行

当HttpClient拥有类似PoolingClientConnectionManage类这样的池连接管理器,它就能够使用多线程来并发执行多个请求。

PoolingClientConnectionManager类将根据其配置分配连接。如果给定路由的所有连接都已租用,则会阻塞对连接的请求,直到有连接释放回到连接池。可以通过将“http.conn-manager.timeout”设置为正值来确保连接管理器在连接请求操作中不会无限期地阻塞。如果连接请求不能在给定的期限内提供服务,会抛出ConnectionPoolTimeoutException异常。

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
        .setConnectionManager(cm)
        .build();

// URIs to perform GETs on
String[] urisToGet = {
    "http://www.domain1.com/",
    "http://www.domain2.com/",
    "http://www.domain3.com/",
    "http://www.domain4.com/"
};

// create a thread for each URI
GetThread[] threads = new GetThread[urisToGet.length];
for (int i = 0; i < threads.length; i++) {
    HttpGet httpget = new HttpGet(urisToGet[i]);
    threads[i] = new GetThread(httpClient, httpget);
}

// start the threads
for (int j = 0; j < threads.length; j++) {
    threads[j].start();
}

// join the threads
for (int j = 0; j < threads.length; j++) {
    threads[j].join();
}

HttpClient接口的实例是线程安全的,可以在多个执行线程之间共享,强烈建议每个线程维护自己的专用HttpContext接口实例。

static class GetThread extends Thread {

    private final CloseableHttpClient httpClient;
    private final HttpContext context;
    private final HttpGet httpget;

    public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
        this.httpClient = httpClient;
        this.context = HttpClientContext.create();
        this.httpget = httpget;
    }

    @Override
    public void run() {
        try {
            CloseableHttpResponse response = httpClient.execute(
                    httpget, context);
            try {
                HttpEntity entity = response.getEntity();
            } finally {
                response.close();
            }
        } catch (ClientProtocolException ex) {
            // Handle protocol errors
        } catch (IOException ex) {
            // Handle I/O errors
        }
    }

}

 转载自 并发编程网 - ifeve.com

相关文章
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
39 0
|
3月前
|
存储 Linux API
select、poll、epoll、多线程实现并发请求处理
select、poll、epoll、多线程实现并发请求处理
28 0
|
9月前
|
缓存 负载均衡 前端开发
【计算机组成原理】4核心8线程的服务器每秒大概能处理多少请求?
【计算机组成原理】4核心8线程的服务器每秒大概能处理多少请求?
190 0
|
9月前
|
数据采集 负载均衡 Python
如何利用Python的请求库和代理实现多线程网页抓取的并发控制
如何利用Python的请求库和代理实现多线程网页抓取的并发控制
|
9月前
|
NoSQL Redis 数据安全/隐私保护
Redis单线程处理IO请求性能瓶颈有哪些?
Redis单线程处理IO请求性能瓶颈有哪些?
|
11月前
|
消息中间件 数据采集 Java
Flask嵌套启动子线程如何读取请求上下文?
Flask嵌套启动子线程如何读取请求上下文?
139 0
|
SQL Java 数据库
客户端线程占用过多引起等待,从而出现请求缓慢的情况
客户端线程占用过多引起等待,从而出现请求缓慢的情况
169 0
客户端线程占用过多引起等待,从而出现请求缓慢的情况
|
API iOS开发
iOS多个线程发起相同请求,避免重复
有时候在调用多个模块时,会对同一个API进行多次请求,但因为内容都是一样的,所以最好就是加上锁,防止重复请求造成网络资源浪费
152 0
使用多线程分别请求,然后将结果聚合处理【项目使用】
使用多线程分别请求,然后将结果聚合处理【项目使用】
82 0
|
Java 测试技术
Java 线程池模拟用户并发请求接口代码示例
Java 线程池模拟用户并发请求接口代码示例