我有一个 respond.php ,它为每个带有不同标头数据的HTTP POST返回一个JSON数据。 一次生成30个请求并处理其响应数据的最有效方法是什么?这需要非常高效,因为硬件的性能相当有限。
答案 0 :(得分:3)
“一次生成30个请求并处理其响应数据”,这一点尚不清楚。
但是>>YOUR<<
时间(和我们的时间)的最有效使用是以直接的方式实现这一点,然后看看性能是否足够好。当简单的解决方案足够好时,花费很多额外的时间编写一个超高效的解决方案毫无意义。
简单的解决方案是创建30个客户端线程,并使用HttpUrlConnection让每个线程发送一个POST请求。这是否“有效”取决于哪些资源是瓶颈。 (当然,这同样适用于如何使其更“高效”的想法。)说硬件“相当有限的性能”并没有真正给我们提供很多线索。 ..
一旦你有一个简单的解决方案,并且你已经确定了实际的瓶颈区域(客户端CPU?线程堆栈?网络速度?)......我们可以就如何使代码更快地提出有意义的建议。但是,通过要求“最有效”的解决方案,您只是鼓励人们猜测瓶颈是什么。
最后一点。当你说“最有效”时,有两种方法可以解释它。您可能意味着,一种解决方案,可以在最短的时间内发送请求并处理响应。或者,您可能意味着在客户端和/或服务器上放置最少的资源(CPU和/或内存和/或网络带宽)的解决方案。这不仅仅是一个狡辩。 “高效”的不同风格需要明显不同的解决方案。
答案 1 :(得分:-1)
使用这些高级api代码,代码更清晰,更易于使用。
public static void main(String args[]) {
int THREAD_COUNT = 30;
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);
//Add the enw jobs where we just insert
List<Callable<Void>> jobs = new ArrayList<Callable<Void>>();
for (int i = 0; i < THREAD_COUNT; i++) {
jobs.add(new Callable<Void>() {
@Override
public Void call() throws Exception {
URL url = new URL("http://yourserver.com/respond.php");
URLConnection conn = url.openConnection();
conn.setDoInput(true);
// Here is where you would use a JSON parser library to parse from the conn.getInputStream method.
// Don't forget to close the input stream.
// And then you can handle and do stuff here.
return null; //aren't interested in the returned value
}
});
}
executorService.invokeAll(jobs);
}