杨教授工作室精心创作的优秀程序员职业提升必读系列资料
1. 1 多线程模式下使用HttpClient4组件
1. 1. 1 ThreadSafeClientConnManager类
1、对于同一个HttpConnection同一个时间只能有一个线程访问
由于连接是一种有限的资源每个连接在某一时刻只能供一个线程和方法使用所以需要确保在需要时正确地分配连接。HttpC lient采用了一种类似jdbc连接池的方法来管理连接这个管理工作由MultiThreadedHttpConnec tio nManager完成。
为了保证多线程工作环境下不产生冲突 httpc lie nt使用了一个多线程连接管理器的类ThreadS a feC lientCo nnManager。
2、 ThreadS a feC lie ntC o nnManager类
ThreadSafeClientConnManager类支持下面的两个默认设置项目
ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE每个主机的最大并行链接数默认为2
ConnManagerPNames.MAX_TOTAL_CONNECTIONS客户端总并行链接最大数默认为20
3、 SchemeRegistry类
4、添加一个线程类
1类名称为MultiGetThread包名称为co m.p x1987.httpc lient并且继承j ava.lang.Thread
杨教授工作室版权所有盗版必究 1/7页
杨教授工作室精心创作的优秀程序员职业提升必读系列资料类
2编程该类的代码package com.px1987.httpclient;import java. io. IOException;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.protocol.BasicHttpContext;import org.apache.http.protocol.HttpContext;import org.apache.http.util.EntityUtils;public class MultiGetThread extends Thread {
杨教授工作室精心创作的优秀程序员职业提升必读系列资料private final HttpClient httpClient;private final HttpContext context;private final HttpGet httpGetMethod;private final int threadNo;public MultiGetThread(HttpClient httpClient, HttpGet httpGetMethod, intthreadNo) {this.httpClient = httpClient;this.context = new BasicHttpContext() ;this.httpGetMethod = httpGetMethod;this. threadNo = threadNo;
}
@Overridepublic void run() {
System.out.println(threadNo + " 号 线 程 将要 访 问 " +httpGetMethod.getURI() ) ;try {
HttpResponse response = httpClient.execute(httpGetMethod, context) ;
HttpEntity entity = response.getEntity() ;if (entity != null) {byte[] bytes = EntityUtils. toByteArray(entity) ;
System.out.println(threadNo + "号线程获得长度为" + bytes. length + "字节数据。 ") ;
}
} catch (IOException exception) {
System.out.println(threadNo+"号线程执行过程中出现了下面的错误 "+exception) ;
}finally{httpGetMethod.abort() ;
}
杨教授工作室版权所有盗版必究 3/7页
杨教授工作室精心创作的优秀程序员职业提升必读系列资料}
}
注意需要对每一个HttpClient.execute()的调用必须要有一个abort()与之匹配。
5、多线程模式下使用HttpC lient的代码示例——HttpC lientMultiThreadedDemo
1在项目中添加HttpClientMultiThreadedDemo类
2代码示例package com.px1987.httpclient;import org.apache.http.HttpVersion;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.params.ConnManagerParams;import org.apache.http.conn. scheme.PlainSocketFactory;
杨教授工作室精心创作的优秀程序员职业提升必读系列资料import org.apache.http.conn. scheme.Scheme;import org.apache.http.conn. scheme.SchemeRegistry;import org.apache.http.conn. ssl.SSLSocketFactory;import org.apache.http. impl.client.DefaultHttpClient;import org.apache.http. impl.conn. tsccm.ThreadSafeClientConnManager;import org.apache.http.params.BasicHttpParams;import org.apache.http.params.HttpParams;import org.apache.http.params.HttpProtocolParams;public class HttpClientMultiThreadedDemo {
HttpClient httpClient=null;public HttpClientMultiThreadedDemo() {
HttpParams params = new BasicHttpParams() ;
ConnManagerParams. setMaxTotalConnections(params, 100) ;
HttpProtocolParams. setVersion(params, HttpVersion.HTTP_1_1) ;
SchemeRegistry schemeRegistry = new SchemeRegistry() ;schemeRegistry.register(new Scheme("http",
PlainSocketFactory.getSocketFactory() , 8080) ) ;schemeRegistry.register(new Scheme("https",
SSLSocketFactory.getSocketFactory() , 8443) ) ;
ClientConnectionManager cm = new ThreadSafeClientConnManager(params,schemeRegistry) ;httpClient = new DefaultHttpClient(cm, params) ;
String targetURIToGet = "http://127. 0.0. 1:8080/webbank/index. jsp";MultiGetThread[] threads = new MultiGetThread[10] ;for (int i = 0; i < threads. length; i++) {
HttpGet httpGetMethod = new HttpGet(targetURIToGet) ;threads[i] = new MultiGetThread(httpClient, httpGetMethod, i + 1) ;threads[i] . start() ;
}
/*
杨教授工作室版权所有盗版必究 5/7页
杨教授工作室精心创作的优秀程序员职业提升必读系列资料
*不能再此释放连接 因为在线程中海需要应用 httpClient对象本示例为异
步请求
*/
// httpClient.getConnectionManager() . shutdown() ;
}protected void finalize() {httpCl ient.getConnectionManager() . shutdown() ; //释放连接
}public static void main(String[] args) throws Exception {
HttpClientMultiThreadedDemo httpClientMultiThreadedDemo=newHttpClientMultiThreadedDemo() ;
}
}
在客户端的代码中同时产生出10个线程 向同一个URL地址发送请求。注意释放httpClient对象的方式否则会出现下面的错误。
6、示例代码执行的结果
杨教授工作室版权所有盗版必究 6/7页
杨教授工作室精心创作的优秀程序员职业提升必读系列资料
该示例其实是Web性能测试的基础。
小欢互联成立于2019年10月,主打海外高性价比云服务器、CDN和虚拟主机服务。近期上线了自营美国CERA机房高速VPS,进行促销活动,为客户奉上美国/香港八折优惠码:Xxc1mtLB优惠码适用于美国CERA一区/二区以及香港一区/二区优惠时间:即日起至10月底优惠码可无限次使用,且续费同价!官网:https://idc.xh-ws.com购买地址:美国CERA一区:https://idc.xh-...
Sharktech最近洛杉矶和丹佛低价配置大部分都无货了,只有荷兰机房还有少量库存,商家又提供了两款洛杉矶特价独立服务器,价格不错,CPU/内存/硬盘都是高配,1-10Gbps带宽不限流量最低129美元/月起。鲨鱼机房(Sharktech)我们也叫它SK机房,是一家成立于2003年的老牌国外主机商,提供的产品包括独立服务器租用、VPS主机等,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹等,主...
蓝竹云怎么样 蓝竹云好不好蓝竹云是新商家这次给我们带来的 挂机宝25元/年 美国西雅图云服务器 下面是套餐和评测,废话不说直接开干~~蓝竹云官网链接点击打开官网江西上饶挂机宝宿主机配置 2*E5 2696V2 384G 8*1500G SAS RAID10阵列支持Windows sever 2008,Windows sever 2012,Centos 7.6,Debian 10.3,Ubuntu1...