httpclient4.5 多线程 支持多少线程

让天下没有难学的技术
《HttpClient官方文档》2.4 多线程请求执行
《HttpClient官方文档》2.4 多线程请求执行
2.4.多线程请求执行
当HttpClient拥有类似PoolingClientConnectionManage类这样的池连接管理器,它就能够使用多线程来并发执行多个请求。
PoolingClientConnectionManager类将根据其配置分配连接。如果给定路由的所有连接都已租用,则会阻塞对连接的请求,直到有连接释放回到连接池。可以通过将“http.conn-manager.timeout”设置为正值来确保连接管理器在连接请求操作中不会无限期地阻塞。如果连接请求不能在给定的期限内提供服务,会抛出ConnectionPoolTimeoutException异常。
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
// URIs to perform GETs on
String[] urisToGet = {
// create a thread for each URI
GetThread[] threads = new GetThread[urisToGet.length];
for (int i = 0; i & threads. i++) {
HttpGet httpget = new HttpGet(urisToGet[i]);
threads[i] = new GetThread(httpClient, httpget);
// start the threads
for (int j = 0; j & threads. j++) {
threads[j].start();
// join the threads
for (int j = 0; j & threads. j++) {
threads[j].join();
HttpClient接口的实例是线程安全的,可以在多个执行线程之间共享,强烈建议每个线程维护自己的专用HttpContext接口实例。
static class GetThread extends Thread {
private final CloseableHttpClient httpC
private final HttpC
private final HttpG
public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
this.httpClient = httpC
this.context = HttpClientContext.create();
this.httpget =
public void run() {
CloseableHttpResponse response = httpClient.execute(
httpget, context);
HttpEntity entity = response.getEntity();
} finally {
response.close();
} catch (ClientProtocolException ex) {
// Handle protocol errors
} catch (IOException ex) {
// Handle I/O errors
原创文章,转载请注明: 转载自本文链接地址:
Latest posts by flystarfly ()
Related posts:
(4 votes, average: 3.00 out of 5)
Loading...2.4.多线程请求执行
当HttpClient拥有类似PoolingClientConnectionManage类这样的池连接管理器,它就能够使用多线程来并发执行多个请求。
PoolingClientConnectionManager类将根据其配置分配连接。
2.4.多线程请求执行
当HttpClient拥有类似PoolingClientConnectionManage类这样的池连接管理器,它就能够使用多线程来并发执行多个请求。
PoolingClientConnectionManager类将根据其配置分配连接。如果给定路由的所有连接都已租用,则会阻塞对连接的请求,直到有连接释放回到连接池。可以通过将“http.conn-manager.timeout”设置为正值来确保连接管理器在连接请求操作中不会无限期地阻塞。如果连接请求不能在给定的期限内提供服务,会抛出ConnectionPoolTimeoutException异常。
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
// URIs to perform GETs on
String[] urisToGet = {
// create a thread for each URI
GetThread[] threads = new GetThread[urisToGet.length];
for (int i = 0; i & threads. i++) {
HttpGet httpget = new HttpGet(urisToGet[i]);
threads[i] = new GetThread(httpClient, httpget);
// start the threads
for (int j = 0; j & threads. j++) {
threads[j].start();
// join the threads
for (int j = 0; j & threads. j++) {
threads[j].join();
HttpClient接口的实例是线程安全的,可以在多个执行线程之间共享,强烈建议每个线程维护自己的专用HttpContext接口实例。
static class GetThread extends Thread {
private final CloseableHttpClient httpC
private final HttpC
private final HttpG
public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
this.httpClient = httpC
this.context = HttpClientContext.create();
this.httpget =
public void run() {
CloseableHttpResponse response = httpClient.execute(
httpget, context);
HttpEntity entity = response.getEntity();
} finally {
response.close();
} catch (ClientProtocolException ex) {
// Handle protocol errors
} catch (IOException ex) {
// Handle I/O errors
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】浅析混合云和跨地域网络构建实践,分享高性能负载均衡设计,9月21日阿里云专家和你说说网络那些事儿,足不出户看直播,赶紧预约吧!&&
阿里云专门为物联网领域的开发人员推出的,其目的是帮助开发者搭建安全性能强大的数据通道,方便终端(如传感器、执行器...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
MaxCompute75折抢购
Loading...> 博客详情
摘要: 简单的例子,随便看看
1、GetThread.java
package&com.aa.controller.
import&org.apache.http.HttpR
import&org.apache.http.HttpS
import&org.apache.http.client.HttpC
import&org.apache.http.client.methods.HttpH
import&org.apache.http.protocol.BasicHttpC
import&org.apache.http.protocol.HttpC
import&java.util.ArrayL
import&java.util.L
import&java.util.concurrent.ConcurrentHashM
import&java.util.concurrent.CountDownL
&*&Created&by&Administrator&on&.
public&&class&GetThread&extends&Thread{
&&&&private&final&HttpClient&httpC
&&&&private&final&HttpContext&
&&&&private&final&HttpHead&httpH
&&&&private&final&CountDownLatch&threadS
&&&&private&final&ConcurrentHashMap&Integer,Boolean&&hashM
&&&&private&static&List&Thread&&runningThreads&=&new&ArrayList&Thread&();
&&&&public&GetThread(HttpClient&httpClient,&HttpHead&httpHead,&CountDownLatch&threadSignal,&ConcurrentHashMap&Integer,&Boolean&&hashMap)&{
&&&&&&&&this.httpClient&=&httpC
&&&&&&&&this.context&=&new&BasicHttpContext();
&&&&&&&&this.httpHead&=&httpH
&&&&&&&&this.threadSignal&=&threadS
&&&&&&&&this.hashMap&=&hashM
&&&&@Override
&&&&public&void&run(){
&&&&&&&&//System.out.println("abc:"+Thread.currentThread().getName());
&&&&&&&&boolean&b=get();
&&&&&&&&hashMap.put((int)&threadSignal.getCount(),&b);
&&&&&&&&threadSignal.countDown();
&&&&public&boolean&get()&{
&&&&&&&&HttpResponse&response&=&
&&&&&&&&try&{
&&&&&&&&&&&&response&=&httpClient.execute(httpHead);
&&&&&&&&&&&&if(response.getStatusLine().getStatusCode()==&HttpStatus.SC_OK){
&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&}else{
&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&}
&&&&&&&&}&catch&(Exception&e)&{
&&&&&&&&&&&&return&
2、ThreadPoolHttpClient.java
package&com.aa.controller.
import&com.aa.utilities.SysuserU
import&org.apache.http.client.HttpC
import&org.apache.http.client.methods.HttpH
import&org.apache.http.conn.params.ConnManagerP
import&org.apache.http.conn.scheme.PlainSocketF
import&org.apache.http.conn.scheme.S
import&org.apache.http.conn.scheme.SchemeR
import&org.apache.http.impl.client.DefaultHttpC
import&org.apache.http.impl.conn.PoolingClientConnectionM
import&org.apache.http.params.BasicHttpP
import&org.apache.http.params.HttpConnectionP
import&org.apache.http.params.HttpP
import&java.util.D
import&java.util.L
import&java.util.M
import&java.util.concurrent.ConcurrentHashM
import&java.util.concurrent.CountDownL
import&java.util.concurrent.ExecutorS
import&java.util.concurrent.E
public&class&ThreadPoolHttpClient&{
&&&&//&线程池
&&&&private&ExecutorService&exe&=&
&&&&//&线程池的容量
&&&&private&static&&int&POOL_SIZE&=&5;
&&&&private&HttpClient&client&=&
&&&&List&String&&urlList&=&
&&&&public&ThreadPoolHttpClient(List&String&&urlList){
&&&&&&&&this.urlList=urlL
&&&&public&ConcurrentHashMap&Integer,Boolean&&test()&throws&Exception&{
&&&&&&&&int&uSize&=&urlList.size();
&&&&&&&&if(uSize&0&&&&uSize&=12){
&&&&&&&&&&&&POOL_SIZE&=&4;
&&&&&&&&if(uSize&30){
&&&&&&&&&&&&POOL_SIZE&=&6;
&&&&&&&&Date&d1&=&new&Date();
&&&&&&&&final&CountDownLatch&threadSignal&=&new&CountDownLatch(urlList.size());
&&&&&&&&final&ConcurrentHashMap&Integer,Boolean&&hashMap&=&new&ConcurrentHashMap();
&&&&&&&&exe&=&Executors.newFixedThreadPool(POOL_SIZE);
&&&&&&&&HttpParams&params&=new&BasicHttpParams();
&&&&&&&&/*&从连接池中取连接的超时时间&*/
&&&&&&&&ConnManagerParams.setTimeout(params,&1000);
&&&&&&&&/*&连接超时&*/
&&&&&&&&HttpConnectionParams.setConnectionTimeout(params,&2000);
&&&&&&&&/*&请求超时&*/
&&&&&&&&HttpConnectionParams.setSoTimeout(params,&4000);
&&&&&&&&SchemeRegistry&schemeRegistry&=&new&SchemeRegistry();
&&&&&&&&schemeRegistry.register(
&&&&&&&&&&&&&&&&new&Scheme("http",&80,&PlainSocketFactory.getSocketFactory()));
&&&&&&&&//ClientConnectionManager&cm&=&new&PoolingClientConnectionManager(schemeRegistry);
&&&&&&&&PoolingClientConnectionManager&cm=new&PoolingClientConnectionManager(schemeRegistry);
&&&&&&&&cm.setMaxTotal(10);
&&&&&&&&final&HttpClient&httpClient&=&new&DefaultHttpClient(cm,params);
&&&&&&&&//&URIs&to&perform&GETs&on
&&&&&&&&//final&String[]&urisToGet&=&
&&&&&&&&final&List&String&&finalUriGet=urlL
&&&&&&&&/*使用线程池*/
&&&&&&&&for&(int&i&=&0;&i&&&finalUriGet.size();&i++)&{
&&&&&&&&&&&&final&int&j=i;
&&&&&&&&&&&&//System.out.println("j的值:"+j);
&&&&&&&&&&&&HttpHead&httpHead&=&new&HttpHead(finalUriGet.get(j));
&&&&&&&&&&&&GetThread&getThread&=&new&GetThread(httpClient,httpHead,threadSignal,hashMap);
&&&&&&&&&&&&getThread.setName("线程"&+&j);
&&&&&&&&&&&&exe.submit(getThread);
&&&&&&&&threadSignal.await();
&&&&&&&&exe.shutdown();
&&&&&&&&System.out.println("Done");
&&&&&&&&System.out.println("毫秒:"+(new&Date().getTime()-d1.getTime()));
&&&&&&&&return&hashM
&&&&public&ConcurrentHashMap&Integer,Boolean&&getHashMapByUrls(){
&&&&&&&&ThreadPoolHttpClient&threadPoolHttpClient&=&new&ThreadPoolHttpClient(urlList);
&&&&&&&&try&{
&&&&&&&&&&&&ConcurrentHashMap&Integer,Boolean&&hashMap&=threadPoolHttpClient.test();
&&&&&&&&&&&&for(Map.Entry&Integer,Boolean&&e:hashMap.entrySet()){
&&&&&&&&&&&&&&&&System.out.println("key:"+e.getKey()+"_____|||&value:"+e.getValue());
&&&&&&&&&&&&}
&&&&&&&&&&&&return&&hashM
&&&&&&&&}&catch&(Exception&e)&{
&&&&&&&&&&&&e.printStackTrace();
&&&&&&&&return&
人打赏支持
参与源创会
领取时间:
“”在线下联结了各位 OSCer,推广开源项目和理念,很荣幸有你的参与~
领取条件:参与过开源中国“源创会”的 OSCer 可以领取
码字总数 64286
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥httpClient多线程请求 - 刺猬的温驯 - 博客园
使用httpClient可模拟请求Url获取资源,使用单线程的请求速度上会有一定的限制,参考了Apache给出的例子,自己做了测试实现多线程并发请求,以下代码需要HttpClient 4.2的包,可以在下载1、并发请求View Code&&1&package&generate.&&2&&&3&import&java.util.L&&4&import&java.util.concurrent.ExecutorS&&5&import&java.util.concurrent.E&&6&&&7&import&org.apache.http.HttpE&&8&import&org.apache.http.HttpR&&9&import&org.apache.http.client.HttpC&10&import&org.apache.http.client.methods.HttpG&11&import&org.apache.http.conn.ClientConnectionM&12&import&org.apache.http.conn.params.ConnManagerP&13&import&org.apache.http.conn.scheme.PlainSocketF&14&import&org.apache.http.conn.scheme.S&15&import&org.apache.http.conn.scheme.SchemeR&16&import&org.apache.http.impl.client.DefaultHttpC&17&import&org.apache.http.impl.conn.PoolingClientConnectionM&18&import&org.apache.http.params.BasicHttpP&19&import&org.apache.http.params.HttpConnectionP&20&import&org.apache.http.params.HttpP&21&import&org.apache.http.protocol.BasicHttpC&22&import&org.apache.http.protocol.HttpC&23&import&org.apache.http.util.EntityU&24&&25&public&class&ThreadPoolHttpClient&{&26&&&&&//&线程池&27&&&&&private&ExecutorService&exe&=&null;&28&&&&&//&线程池的容量&29&&&&&private&static&final&int&POOL_SIZE&=&20;&30&&&&&private&HttpClient&client&=&null;&31&&&&&String[]&urls=null;&32&&&&&public&ThreadPoolHttpClient(String[]&urls){&33&&&&&&&&&this.urls=&34&&&&&}&35&&&&&public&void&test()&throws&Exception&{&36&&&&&&&&&exe&=&Executors.newFixedThreadPool(POOL_SIZE);&37&&&&&&&&&HttpParams&params&=new&BasicHttpParams();&38&&&&&&&&&/*&从连接池中取连接的超时时间&*/&&39&&&&&&&&&ConnManagerParams.setTimeout(params,&1000);&40&&&&&&&&&/*&连接超时&*/&&41&&&&&&&&&HttpConnectionParams.setConnectionTimeout(params,&2000);&&42&&&&&&&&&/*&请求超时&*/&43&&&&&&&&&HttpConnectionParams.setSoTimeout(params,&4000);&44&&&&&&&&&SchemeRegistry&schemeRegistry&=&new&SchemeRegistry();&45&&&&&&&&&schemeRegistry.register(&46&&&&&&&&&&&&&&&&&new&Scheme("http",&80,&PlainSocketFactory.getSocketFactory()));&47&&48&&&&&&&&&//ClientConnectionManager&cm&=&new&PoolingClientConnectionManager(schemeRegistry);&49&&&&&&&&&PoolingClientConnectionManager&cm=new&PoolingClientConnectionManager(schemeRegistry);&50&&&&&&&&&cm.setMaxTotal(10);&51&&&&&&&&&final&HttpClient&httpClient&=&new&DefaultHttpClient(cm,params);&52&&53&&&&&&&&&//&URIs&to&perform&GETs&on&54&&&&&&&&&final&String[]&urisToGet&=&&55&&&&&&&&&/*&有多少url创建多少线程,url多时机子撑不住&56&&&&&&&&&//&create&a&thread&for&each&URI&57&&&&&&&&&GetThread[]&threads&=&new&GetThread[urisToGet.length];&58&&&&&&&&&for&(int&i&=&0;&i&&&threads.&i++)&{&59&&&&&&&&&&&&&HttpGet&httpget&=&new&HttpGet(urisToGet[i]);&60&&&&&&&&&&&&&threads[i]&=&new&GetThread(httpClient,&httpget);&&&&&&&&&&&&&61&&&&&&&&&}&62&&&&&&&&&//&start&the&threads&63&&&&&&&&&for&(int&j&=&0;&j&&&threads.&j++)&{&64&&&&&&&&&&&&&threads[j].start();&65&&&&&&&&&}&66&&67&&&&&&&&&//&join&the&threads,等待所有请求完成&68&&&&&&&&&for&(int&j&=&0;&j&&&threads.&j++)&{&69&&&&&&&&&&&&&threads[j].join();&70&&&&&&&&&}&71&&&&&&&&&使用线程池*/&72&&&&&&&&&for&(int&i&=&0;&i&&&urisToGet.&i++)&{&73&&&&&&&&&&&&&final&int&j=i;&74&&&&&&&&&&&&&System.out.println(j);&75&&&&&&&&&&&&&HttpGet&httpget&=&new&HttpGet(urisToGet[i]);&76&&&&&&&&&&&&&exe.execute(&new&GetThread(httpClient,&httpget));&77&&&&&&&&&}&78&&&&&&&&&&79&&&&&&&&&&80&&&&&&&&&//创建线程池,每次调用POOL_SIZE&81&&&&&&&&&/*&82&&&&&&&&&for&(int&i&=&0;&i&&&urisToGet.&i++)&{&83&&&&&&&&&&&&&final&int&j=i;&84&&&&&&&&&&&&&System.out.println(j);&85&&&&&&&&&&&&&exe.execute(new&Thread()&{&86&&&&&&&&&&&&&&&&&@Override&87&&&&&&&&&&&&&&&&&public&void&run()&{&88&&&&&&&&&&&&&&&&&&&&&this.setName("threadsPoolClient"+j);&89&&&&&&&&&&&&&&&&&&&&&&90&&&&&&&&&&&&&&&&&&&&&&&&&try&{&91&&&&&&&&&&&&&&&&&&&&&&&&&&&&&this.sleep(100);&92&&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println(j);&93&&&&&&&&&&&&&&&&&&&&&&&&&}&catch&(InterruptedException&e)&{&94&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&TODO&Auto-generated&catch&block&95&&&&&&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&96&&&&&&&&&&&&&&&&&&&&&&&&&}&97&&&&&&&&&&&&&&&&&&&&&&&&&&98&&&&&&&&&&&&&&&&&&&&&&&&&HttpGet&httpget&=&new&HttpGet(urisToGet[j]);&99&&&&&&&&&&&&&&&&&&&&&&&&&new&GetThread(httpClient,&httpget).get();100&&&&&&&&&&&&&&&&&&&&&}101&&&&&&&&&&&&&&&&&&&&&102&&&&&&&&&&&&&&&&&&&&&103&&&&&&&&&&&&&&&&&104&&&&&&&&&&&&&});105&&&&&&&&&}106&&&&&&&&&107&&&&&&&&&*/108&&&&&&&&&//exe.shutdown();109&&&&&&&&&System.out.println("Done");110&&&&&}111&&&&&static&class&GetThread&extends&Thread{112&&&&&&&&&113&&&&&&&&&private&final&HttpClient&httpC114&&&&&&&&&private&final&HttpContext&115&&&&&&&&&private&final&HttpGet&116&&&&&&&&&117&&&&&&&&&public&GetThread(HttpClient&httpClient,&HttpGet&httpget)&{118&&&&&&&&&&&&&this.httpClient&=&httpC119&&&&&&&&&&&&&this.context&=&new&BasicHttpContext();120&&&&&&&&&&&&&this.httpget&=&121&&&&&&&&&}122&&&&&&&&&@Override123&&&&&&&&&public&void&run(){124&&&&&&&&&&&&&this.setName("threadsPoolClient");125&&&&&&&&&&&&&try&{126&&&&&&&&&&&&&&&&&Thread.sleep(5000);127&&&&&&&&&&&&&}&catch&(InterruptedException&e)&{128&&&&&&&&&&&&&&&&&//&TODO&Auto-generated&catch&block129&&&&&&&&&&&&&&&&&e.printStackTrace();130&&&&&&&&&&&&&}131&&&&&&&&&&&&&get();132&&&&&&&&&}133&&&&&&&&&134&&&&&&&&&public&void&get()&{135&&&&&&&&&&&&&try&{136&&&&&&&&&&&&&&&&&HttpResponse&response&=&this.httpClient.execute(this.httpget,&this.context);137&&&&&&&&&&&&&&&&&HttpEntity&entity&=&response.getEntity();138&&&&&&&&&&&&&&&&&if&(entity&!=&null)&{139&&&&&&&&&&&&&&&&&&&&&System.out.println(this.httpget.getURI()+":&status"+response.getStatusLine().toString());140&&&&&&&&&&&&&&&&&}141&&&&&&&&&&&&&&&&&//&ensure&the&connection&gets&released&to&the&manager142&&&&&&&&&&&&&&&&&EntityUtils.consume(entity);143&&&&&&&&&&&&&}&catch&(Exception&ex)&{144&&&&&&&&&&&&&&&&&this.httpget.abort();145&&&&&&&&&&&&&}finally{146&&&&&&&&&&&&&&&&&httpget.releaseConnection();147&&&&&&&&&&&&&}148&&&&&&&&&}149&&&&&}150&}&2、多线程异步请求View Code&&1&package&generate.&&2&&&3&import&java.io.ByteArrayOutputS&&4&import&java.io.IOE&&5&import&java.io.InputS&&6&import&java.util.ArrayL&&7&import&java.util.HashM&&8&import&java.util.L&&9&import&java.util.M&10&import&java.util.concurrent.CountDownL&11&&12&import&org.apache.http.HttpR&13&import&org.apache.http.client.methods.HttpG&14&import&org.apache.http.concurrent.FutureC&15&import&org.apache.http.impl.nio.client.DefaultHttpAsyncC&16&import&org.apache.http.nio.client.HttpAsyncC&17&import&org.apache.http.nio.reactor.IOReactorE&18&&19&public&class&AsynClient{&20&&&&&/**&21&&&&&&*&@param&args&22&&&&&&*&@throws&IOReactorException&23&&&&&&*&@throws&InterruptedException&24&&&&&&*/&25&&&&&private&List&String&&&26&&&&&private&HandlerFailThread&failH&27&&&&&public&AsynClient(List&String&&list){&28&&&&&&&&&failHandler=new&HandlerFailThread();&29&&&&&&&&&urls=&30&&&&&}&31&&&&&public&Map&String,String&&asynGet()&throws&IOReactorException,&32&&&&&&&&&&&&&InterruptedException&{&33&&&&&&&&&final&HttpAsyncClient&httpclient&=&new&DefaultHttpAsyncClient();&34&&&&&&&&&httpclient.start();&35&&&&&&&&&int&urlLength=urls.size();&36&&&&&&&&&HttpGet[]&requests&=&new&HttpGet[urlLength];&37&&&&&&&&&int&i=0;&38&&&&&&&&&for(String&url&:&urls){&39&&&&&&&&&&&&&requests[i]=new&HttpGet(url);&40&&&&&&&&&&&&&i++;&41&&&&&&&&&}&42&&&&&&&&&final&CountDownLatch&latch&=&new&CountDownLatch(requests.length);&43&&&&&&&&&final&Map&String,&String&&responseMap=new&HashMap&String,&String&();&44&&&&&&&&&try&{&45&&&&&&&&&&&&&for&(final&HttpGet&request&:&requests)&{&46&&&&&&&&&&&&&&&&&httpclient.execute(request,&new&FutureCallback&HttpResponse&()&{&47&&48&&&&&&&&&&&&&&&&&&&&&public&void&completed(final&HttpResponse&response)&{&49&&&&&&&&&&&&&&&&&&&&&&&&&latch.countDown();&50&&&&&&&&&&&&&&&&&&&&&&&&&responseMap.put(request.getURI().toString(),&response.getStatusLine().toString());&51&&&&&&&&&&&&&&&&&&&&&&&&&try&{&52&&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println(request.getRequestLine()&+&"-&"&53&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&response.getStatusLine()+"-&");&54&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//+readInputStream(response.getEntity().getContent())&55&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&56&&&&&&&&&&&&&&&&&&&&&&&&&}&catch&(IllegalStateException&e)&{&57&&&&&&&&&&&&&&&&&&&&&&&&&&&&&failHandler.putFailUrl(request.getURI().toString(),&58&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&response.getStatusLine().toString());&59&&&&&&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&60&&&&&&&&&&&&&&&&&&&&&&&&&}&catch&(Exception&e)&{&61&&&&&&&&&&&&&&&&&&&&&&&&&&&&&failHandler.putFailUrl(request.getURI().toString(),&62&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&response.getStatusLine().toString());&63&&&&&&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&64&&&&&&&&&&&&&&&&&&&&&&&&&}&65&&&&&&&&&&&&&&&&&&&&&}&66&&67&&&&&&&&&&&&&&&&&&&&&public&void&failed(final&Exception&ex)&{&68&&&&&&&&&&&&&&&&&&&&&&&&&latch.countDown();&69&&&&&&&&&&&&&&&&&&&&&&&&&ex.printStackTrace();&70&&&&&&&&&&&&&&&&&&&&&&&&&failHandler.putFailUrl(request.getURI().toString(),&71&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ex.getMessage());&72&&&&&&&&&&&&&&&&&&&&&}&73&&74&&&&&&&&&&&&&&&&&&&&&public&void&cancelled()&{&75&&&&&&&&&&&&&&&&&&&&&&&&&latch.countDown();&76&&&&&&&&&&&&&&&&&&&&&}&77&&78&&&&&&&&&&&&&&&&&});&79&&&&&&&&&&&&&}&80&&&&&&&&&&&&&System.out.println("Doing...");&81&&&&&&&&&}&finally&{&82&&&&&&&&&&&&&latch.await();&83&&&&&&&&&&&&&httpclient.shutdown();&84&&&&&&&&&}&85&&&&&&&&&System.out.println("Done");&86&&&&&&&&&failHandler.printFailUrl();&87&&&&&&&&&return&responseM&88&&&&&}&89&&&&&private&String&readInputStream(InputStream&input)&throws&IOException{&90&&&&&&&&&byte[]&buffer&=&new&byte[128];&91&&&&&&&&&int&len&=&0;&92&&&&&&&&&ByteArrayOutputStream&bytes&=&new&ByteArrayOutputStream();&93&&&&&&&&&while((len&=&input.read(buffer))&&=&0)&{&94&&&&&&&&&&&&&bytes.write(buffer,&0,&len);&95&&&&&&&&&}&96&&&&&&&&&return&bytes.toString();&97&&&&&}&98&&&&&/**&99&&&&&&*&Test100&&&&&&*&@param&args101&&&&&&*/102&&&&&public&static&void&main(String[]&args)&{103&&&&&&&&&List&String&&urls=new&ArrayList&String&();104&&&&&&&&&urls.add("http://127.0.0.1/examples/servlets/");105&&&&&&&&&urls.add("http://127.0.0.1/examples/servlets/");106&&&&&&&&&urls.add("http://127.0.0.1/examples/servlets/");107&&&&&&&&&for(int&i=0;i&10;i++){108&&&&&&&&&&&&&urls.addAll(urls);109&&&&&&&&&}110&&&&&&&&&System.out.println(urls.size());111&&&&&&&&&AsynClient&client=new&AsynClient(urls);112&&&&&&&&&try&{113&&&&&&&&&&&&&client.asynGet();114&&&&&&&&&}&catch&(IOReactorException&e)&{115&&&&&&&&&&&&&e.printStackTrace();116&&&&&&&&&}&catch&(InterruptedException&e)&{117&&&&&&&&&&&&&e.printStackTrace();118&&&&&&&&&}119&&&&&&&&&System.out.println("done");120&&&&&}121&}创建一个线程记录失败的请求&View Code&1&package&generate.&2&&3&import&java.util.HashM&4&import&java.util.M&5&&6&public&class&HandlerFailThread&&extends&Thread{&7&&&&&Map&String,&String&&failUrl=new&HashMap&String,&String&();&8&&&&&public&void&putFailUrl(String&url,String&status){&9&&&&&&&&&synchronized&(failUrl)&{10&&&&&&&&&&&&&failUrl.put(url,status);11&&&&&&&&&}12&&&&&}13&&&&&@Override14&&&&&public&void&run()&{15&&&&&&&&&while(true){16&&&&&&&&&&&&&17&&&&&&&&&}18&&&&&}19&&&&&public&void&printFailUrl(){20&&&&&&&&&for(Map.Entry&String,&String&&m:&failUrl.entrySet()){21&&&&&&&&&&&&&System.out.println("****fail:url:"+m.getKey()+&"&&code&:"+m.getValue());22&&&&&&&&&}23&&&&&}24&}&&异步请求,也可通过pool管理,例如&ConnectingIOReactor nio=new DefaultConnectingIOReactor();&&PoolingClientAsyncConnectionManager manager=new PoolingClientAsyncConnectionManager(nio);&&manager.setMaxTotal(1000);&&manager.setDefaultMaxPerRoute(100);&&HttpParams params=new BasicHttpParams();&&/* 连接超时 */&&&HttpConnectionParams.setConnectionTimeout(params, 10000);&&&/* 请求超时 */&&HttpConnectionParams.setSoTimeout(params, 60*1000);&&DefaultHttpAsyncClient.setDefaultHttpParams(params);&&final HttpAsyncClient httpclient = new DefaultHttpAsyncClient(manager);&&httpclient.start();&HttpClient相关可参看,里面有很多说明与例子

我要回帖

更多关于 httpclient多线程并发 的文章

 

随机推荐