1
try{
// create new httpPost request with url of his class
HttpPost httpPost = new HttpPost("http://192.168.1.229:8080/flightcache/flightcache");
// create params and add it to httpPost
List<NameValuePair> paramList = new ArrayList<NameValuePair>();
paramList.add(new BasicNameValuePair("json_req", format));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(formEntity);
// execute request and save response
CloseableHttpResponse response = httpclient.execute(httpPost, context);
HttpEntity entity = response.getEntity();
for(Header header : response.getAllHeaders()){
System.out.println(header.getName() + ":" + header.getValue());
}
resp = entity.getContent().available() > 0;
response.close();
httpclient.close();
// return the response
}
catch(Exception e){
e.printStackTrace();
}
我試圖發送多個HttpPost請求併發到我的Servlet,但只有一個線程執行上面的代碼正在接收響應。我檢查了我的Servlet,但響應寫入正確。 httpClient
創建如下。Java多線程HttpClient-4.3.3問題
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
任何人都可以請幫助/解釋我爲什麼只有一個線程正在接收響應?
預先感謝
public static void main(String[] args) throws Exception{
FileUtil.init();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(200);
cm.setDefaultMaxPerRoute(200);
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
HTTPThread.THREAD_COUNT = 2;
HTTPThread.start = new CountDownLatch(HTTPThread.THREAD_COUNT);
Thread[] threads = new Thread[ HTTPThread.THREAD_COUNT ];
for(int i = 0; i < HTTPThread.THREAD_COUNT; i++){
threads[ i ] = new Thread(new HTTPThread(httpClient));
}
for(Thread thread : threads){
thread.start();
}
for(Thread thread : threads){
thread.join();
}
httpClient.close();
System.out.println("Average response time: " + calAverage(HTTPThread.times) + " milliseconds.");
}
類HTTPThread:
public HTTPThread(CloseableHttpClient httpclient){
this.httpclient = httpclient;
context = HttpClientContext.create();
}
public void run(){
String format = randomRequest();
start.countDown();
try{
start.await();
}
catch(InterruptedException e){
e.printStackTrace();
}
boolean resp = false;
long timeMillis = System.currentTimeMillis();
try{
// create new httpPost request with url of his class
HttpPost httpPost = new HttpPost("http://192.168.1.229:8080/flightcache/flightcache");
// create params and add it to httpPost
List<NameValuePair> paramList = new ArrayList<NameValuePair>();
paramList.add(new BasicNameValuePair("json_req", format));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(formEntity);
// execute request and save response
CloseableHttpResponse response = httpclient.execute(httpPost, context);
HttpEntity entity = response.getEntity();
resp = entity.getContent().available() > 0;
response.close();
httpclient.close();
// return the response
}
catch(Exception e){
e.printStackTrace();
}
long end = System.currentTimeMillis() - timeMillis;
if(!resp){
System.out.println("Response was empty.");
}
if(end <= 0){
times.add(1L);
}
else{
times.add(end);
}
}
你可以顯示你處理線程的代碼嗎? –
我發佈了上面的代碼。這是一個簡單的主要方法,它創建一個定義的線程數並啓動它們。 – aQuip
啊這是一個自定義的可運行 - 抱歉還需要HTTPThread類,在這一點上是主要的罪魁禍首。你可以改變自定義停止等待線程連接? http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html –