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,不然还是会并发,数据丢失。。