我正在用Java编写一个程序,该程序必须对同一服务器上的各个页面进行大约650万次调用(通过附加将从文本文件中读取的用户名稍微改变URL)。首先,我想要知道最有效的方法,其次,任何人都可以猜测这可能消耗多少时间?目前我在ExecutorService对象的一个单独的线程中读取每个url ..类似这样的
ExecutorService executor = Executors.newFixedThreadPool(10);
Runnable worker = new MyRunnable(allUsers[n]);
executor.execute(worker);
并且run方法如下:
is = url.openStream(); // throws an IOException
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
page = page + line;
// More code follows
}
任何建议都将受到高度赞赏
答案 0 :(得分:0)
不,没人能猜出多少"时间"这将消耗。我们不知道服务器是否需要一毫秒或一小时才能完成请求。
最有效的方法是使用更高效的API,允许批量请求。
在10个线程中,您的程序很可能是IO绑定的。您需要分析确保完全CPU使用所需的线程数。您可以使用Java 7功能/ NIO框架(如Netty或MINA)来避免这种情况,因此一个线程可以同时为多个请求提供服务。 (我不确定这些是否是客户端)。
答案 1 :(得分:0)
我同意其他评论和答案,无法预测这需要多长时间,并且“批量转移”请求最有可能提供更好的性能。
还有几点:
如果您可以使用返回JSON或XML而不是网页的RESTful API,那将会更快。
在客户端,如果您提取的文档很大,这将会很有效:
while ((line = br.readLine()) != null) {
page = page + line;
}
这将会进行过多的复制。更好的方法是:
StringBuilder sb = new StringBuilder(...);
while ((line = br.readLine()) != null) {
sb.append(line);
}
page = sb.toString();
如果您可以很好地估算页面大小,那么请创建那个大的StringBuilder
。