我想要平行点击一次网址。我用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);
任何帮助都是适当的。
答案 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);
}
}
}