1

我想同时点击一个 url n 次。我用谷歌搜索并找到了这个网址。我尝试根据我的要求进行更改(点击一个 url n 次并查看每个 URL 的响应),但没有成功。我在上面的链接中添加了以下代码来执行请求并在 Task 类构造函数中获取响应,但是这个只能认真工作。

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);     

任何帮助都会得到帮助。

4

2 回答 2

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);
        }
    }
}
于 2013-04-05T11:47:41.853 回答
1

一种方法是,在线程中创建所有此类请求,创建 n 个线程,然后start()依次创建它们。虽然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);
        }
    }
}
于 2013-04-05T11:16:29.113 回答