平行击打一次网址

时间:2013-04-05 11:07:24

标签: java multithreading

我想要平行点击一次网址。我用Google搜索并找到this网址。我试图根据我的要求进行更改(点击一次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);     

任何帮助都是适当的。

2 个答案:

答案 0 :(得分:2)

您可以使用一个threadPool,其线程数等于您要发送的并行请求数。将您的逻辑(创建和发送请求)包装到可运行的任务中,并使用循环创建和提交任务的实例。

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

答案 1 :(得分: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);
        }
    }
}