2013-04-05 40 views
1

我想並行打n次網址。我搜索了它,發現this的網址。我試圖根據我的需求進行更改(點擊一次url並查看每個響應),但不成功。我在以上鍊接中添加了以下代碼,用於在Task類構造函數中獲取響應並獲取響應,但是此只能在網上工作。平行打n次網址

DefaultHttpClient client = new DefaultHttpClient(); 
    HttpPost method = new HttpPost(aURL); 
    try { 
     HttpResponse httpResponse=client.execute(method); 
     StringBuffer buffer = new StringBuffer(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent())); 
     String dataLine = null; 
     while((dataLine = reader.readLine()) != null){ 
      buffer.append(dataLine); 
     } 
     String responseMsg = buffer.toString(); 
     System.out.println(responseMsg);  

任何幫助appriciated。

+4

試圖複製DoS? – Ankit 2013-04-05 11:08:46

+0

你的用例是什麼? – rajesh 2013-04-05 11:09:45

+0

也許http://jmeter.apache.org/可以幫助你。 – Krab 2013-04-05 11:09:59

回答

1

一種方法是,在線程中創建所有這樣的請求,創建n個線程,然後連續地創建它們。儘管start()是串行的,但是網絡操作將平行進行(在一定程度上)。儘管確切的平行是不可能的。

另一種方法是創建和安排這些n請求任務到特定的時間,雖然timer-task(爲此,獲取當前時間,並給出一些偏移量以便能夠實例化n個線程,並且計劃所有這些時間最初取)

像這樣的代碼:

public void createNparralelRequest(int n){ 
     long time = new Date().gettime(); 
     for(i=0;i<n;i++){ 
      Timer timer = new Timer(); 
      TimerTask task = new TimerTask(){ 
       public void run(){ 
        //call to web request method 
       } 
      timer.schedule(task, time); 
     } 
    } 
} 
2

你可以使用一個線程池與線程等於要發送並行請求數的數量。將您的邏輯(創建併發送請求)封裝到可運行的任務中,並使用循環創建並提交任務的實例。

int numOfThreads = ... <num of parallel requests to generate> 
ExecutorService es = Executors.newFixedThreadPool(numOfThreads); 
for (int i = 0; i < numOfThreads; i++) { 
    es.submit(new Task()); 
} 

你的任務可能是這樣的。你可以在run()實現中做任何你想做的事情。此外,您可以即興使用同步器立即啓動線程。

class Task implements Runnable{ 
    @Override 
    public void run() { 
     DefaultHttpClient client = new DefaultHttpClient(); 
     HttpPost method = new HttpPost(aURL); 
     try { 
      HttpResponse httpResponse=client.execute(method); 
      StringBuffer buffer = new StringBuffer(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent())); 
      String dataLine = null; 
      while((dataLine = reader.readLine()) != null){ 
       buffer.append(dataLine); 
      } 
      String responseMsg = buffer.toString(); 
      System.out.println(responseMsg); 
     } 
    } 
}