多线程下的httpclient

来源:互联网 发布:windows预览体验计划吧 编辑:程序博客网 时间:2024/05/02 04:47

1.如果每开启一个线程,都new HttpClient(), 那么获取的内容会丢失。因为这不是线程安全的。

2.如果要让HttpClient在多线程下每次都得到完整的数据。分两步。

public class HttpClientFactory {      private static  DefaultHttpClient httpClient;          public static DefaultHttpClient getHttpClient(){          if(httpClient==null){        

HttpParams params = new BasicHttpParams();

   // 增加最大连接到200

   ConnManagerParams.setMaxTotalConnections(params, 200);   // 连接最大等待时间   ConnManagerParams.setTimeout(params, 60000 * 3);

   // 增加每个路由的默认最大连接到20

   ConnPerRouteBean connPerRoute = new ConnPerRouteBean(20);   // 设置连接超时时间   HttpConnectionParams.setConnectionTimeout(params, 60000 * 2);   // 设置读取超时时间   HttpConnectionParams.setSoTimeout(params, 60000 * 3);

// 对localhost:80增加最大连接到50 HttpHost localhost = new HttpHost("locahost", 80); connPerRoute.setMaxForRoute(new HttpRoute(localhost), 100); ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register( new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); schemeRegistry.register( new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); return new DefaultHttpClient(cm, params); }else{ return httpClient; } }}


这是建立一个工厂类,创建一个支持多线程的HttpClient。

public class HttpConnect {
 private static HttpClient client = HttpClientFactory.getHttpClient();
 public static HttpResponse action(String url) {  try {   return client.execute(new HttpPost(url));  } catch (ClientProtocolException e) {   e.printStackTrace();  } catch (IOException e) {   e.printStackTrace();  }  return null; }
}

这是外部调用的类,这个HttpConnect是坚持多线程操作 。

 

另外,最最应该注意的是:请保证你的多线程操作的是同一个HttpClient,不然还是会并发,数据丢失。。