`

[转]多线程情况下HttpClient的使用

阅读更多

本文转截自:http://www.thinkingquest.net/articles/210.html

 

3.x版本的httpclient属于apache的commons项目。 从4.x开始,httpclient被转移到了httpcomponent项目下。 api也发生了重大的变化。 http 3.x已经不推荐使用。使用3.x版本的地方,官方建议都升级到4.x版本。

本文的api也都基于4.x版本。下面是一个最simple的案例:

private String upload(String url, HttpEntity entity) {
    String result = null;
     
    HttpClient httpClient = new DefaultHttpClient();
     
    try {
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(entity);
         
        HttpResponse response = httpClient.execute(httpPost);
        int status = response.getStatusLine().getStatusCode();
        if (status == HttpStatus.SC_OK) {
            HttpEntity resEntity = response.getEntity();
            result = EntityUtils.toString(resEntity, "UTF-8");
        } else {
            logger.error("upload:" + url + " error code:" + status);
        }
    } catch (Exception ex) {
        logger.error("Error with HttpClient ", ex);
    } finally {
        try {
            httpClient.getConnectionManager().shutdown();
        } catch (Exception ignore) {}
    }
     
    return result;
 
}

在这段代码中,每调用一次upload方法,都会new一次 BasicHttpClient对象。由此产生一个疑问,这个对象是否是线程安全的呢?查阅了文档,文档中说它是线程安全的。文档地 址:http://hc.apache.org/httpcomponents-client-ga/tutorial/html /httpagent.html

实测对一个BasicHttpClient对象,多个线程调用,只有一个线程运行正常,其他线程全部抛出异常。究其根源,是其中的ConnectionManager的问题。
在多线程的情况下,如果创建一个BasicHttpClient对象,代码应该如下:

PoolingClientConnectionManager cm = new PoolingClientConnectionManager();
 
cm.setMaxTotal(200);
cm.setDefaultMaxPerRoute(20);
 
BasicHttpParams params = new BasicHttpParams();
params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true);
params.setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 64 * 1024);
 
client = new DefaultHttpClient(cm, params);

 

每次执行client.execute(method)之后,需要调用method的releaseConnection()方法。

PoolingClientConnectionManager是其中的关键,替代了默认采用的BasicClientConnectionManager。这样就可以多线程。
setMaxTotal设置的是最大连接数。如果不设置,默认值为20。defaultMaxPerRoute的默认值是2。文档中说,这两个参数过于保守。对于频繁请求的应用来说,都太小了。
关于其它的参数可以参见文档:

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d5e399

 

本文转截自:http://www.thinkingquest.net/articles/210.html

----

PS:

可以使用method的abort方法 哎~~

分享到:
评论

相关推荐

    httpclient著名的多线程框架

    总结,HttpClient作为一款强大的多线程框架,其在Android环境下的应用主要体现在高效的数据加载和下载。通过合理的多线程管理,HttpClient能够显著提升网络操作的性能,同时提供丰富的定制化选项。尽管在新的Android...

    httpclient多线程下载(分段下载)实践

    本篇文章将深入探讨如何使用HTTPClient进行多线程分段下载的实践。 首先,我们要理解多线程下载的基本原理。多线程下载是通过将大文件分割成多个小段,每个线程负责下载一个或多个段,这样可以充分利用多核处理器的...

    用HttpClient写了一个多线程下载软件

    标题中的“用HttpClient写了一个多线程下载软件”意味着我们将探讨如何使用Apache HttpClient库来创建一个支持多线程的文件下载应用。HttpClient是一个强大的Java库,它提供了丰富的HTTP客户端功能,包括请求发起、...

    HttpClient+ Spring实现多线程

    在多线程环境下,HttpClient可以有效地处理并发请求,提高应用程序的性能。 在Spring框架中整合HttpClient,通常会创建一个自定义的HttpClinet工具类,如`HttpClientUtil.java`所示。这个工具类可能包含静态方法,...

    httpclient工具

    本文将详细讲解如何使用HTTPClient进行POST请求,并探讨在多线程环境下的应用,以及与"Grabticket"这个场景相关的实践。 HTTPClient是由Apache基金会开发的一个开源库,它提供了强大的功能来执行HTTP请求,包括GET...

    android 学习笔记6-HttpClient 多线程下载 断点续传 进度条 源码关联

    4、多线程下载:使用RandomAccessFile输出流写 5、多线程下载-断点续传:使用临时文件记录当前下载的数据,下次读取文件开始下载 6、下载显示进度条-ProgressBar 7、在gitbub上面下载已经有支持断点续传功能的代码...

    使用java的HttpClient实现多线程并发

    通过使用HttpClient的连接池和多线程,我们可以有效地并发执行HTTP GET请求,同时控制并发数量,避免过多的网络连接导致服务器压力过大。这种方式提高了请求效率,减少了资源消耗,并且遵循了最佳实践。

    使用Apache HttpClient实现多线程下载的小例子

    这就是使用Apache HttpClient实现多线程下载的基本步骤。通过这种方式,我们可以有效地利用网络带宽,提高大文件下载的速度。同时,注意在实际应用中,还需要考虑错误处理、断点续传、下载进度显示等功能,以提升...

    httpClient使用指南最新版

    - **1.2.1 HttpClient线程安全性**: `HttpClient`实例本身不是线程安全的,但在正确配置下,可以支持多线程并发访问。 - **1.2.2 HttpClient资源释放**: 使用完`HttpClient`后,应该调用其提供的方法来释放资源,...

    HttpClient介绍和使用文档

    HttpClient还支持重试机制、连接池管理、多线程请求等高级特性,使得在处理大量HTTP请求时更加高效和稳定。此外,HttpClient可以与其他Apache Commons库,如HttpCore、HttpComponents等配合使用,实现更复杂的网络...

    C# Winform 多线程下载

    在C# Winform应用中实现多线程下载是一项常见的任务,尤其在处理大文件或需要提高下载速度的情况下。本文将详细讲解如何利用C#的多线程技术来创建一个Winform应用程序,实现高效的文件下载功能。 首先,我们需要...

    C#实现多线程下载文件

    在IT行业中,多线程是提高程序性能和利用系统资源的有效手段,特别是在处理I/O密集型任务如文件下载时。C#作为一种强大的编程语言,提供了丰富的多线程支持,使得开发者能够轻松地创建并管理多个执行线程。本文将...

    httpclient

    同时,需要注意HttpClient不是线程安全的,因此在多线程环境中,每个线程应有自己的HttpClient实例。 6. **处理重定向**: HttpClient默认会自动处理重定向,但你可以通过配置`RedirectStrategy`来改变这一行为。 ...

    commons-httpclient,java中使用httpclient中使用的扩展工具

    默认实现`SingleClientConnManager`适用于单线程或短连接的应用,而`MultiThreadedHttpConnectionManager`则适合多线程和长时间运行的程序,它可以维护一个连接池,提高性能。 2. **请求构造**:你可以使用`...

    httpClient官方文档

    - HttpClient 线程安全(HttpClient Thread Safety):讨论了如何在多线程环境中安全使用HttpClient实例。 - HttpClient 资源释放(HttpClient Resource Deallocation):介绍了如何正确关闭HttpClient实例以释放...

    多线程访问网页测试

    多线程访问网页的部分,通常会使用到HttpClient或者WebClient类。HttpClient是.NET Framework 4.5及更高版本中推荐的HTTP客户端通信工具,它支持异步操作,非常适合多线程环境。程序可能会为每个数字创建一个新的...

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    5. **异步请求**:虽然HttpClient 3.0主要设计为同步模型,但通过多线程和回调机制,可以实现一定程度的异步处理。 四、示例代码 ```java import org.apache.commons.httpclient.HttpClient; import org.apache....

    使用HttpClient异步请求数据

    本篇将详细讲解如何使用`HttpClient`进行异步请求数据,并结合Android的`AsyncTask`来处理后台任务,避免阻塞UI线程。 首先,理解`HttpClient`的基本使用方法。`HttpClient`包含几个关键组件,如`HttpClient`实例、...

    HttpClient

    8. **多线程请求执行**:HttpClient支持在多线程环境中执行请求,这使得在并发环境中使用HttpClient更加安全。 9. **HTTP状态管理**:HttpClient支持HTTP cookie的管理,包括不同版本的cookie处理、cookie策略选择...

    httpclient4.2.1.zip

    1. **多线程支持**:HttpClient 4.2.1支持多线程并发请求,可以高效地处理大量并发连接,提升了处理能力。 2. **连接管理**:它提供了连接池管理,允许重用已建立的TCP连接,减少网络延迟,提高整体性能。 3. **...

Global site tag (gtag.js) - Google Analytics