2013-04-05 38 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); 
     } 
    } 
}