【发布时间】:2015-12-18 23:31:06
【问题描述】:
我正在处理一项任务,我需要从我的 java 程序向 HTTPS url 发出多个请求并读取响应。这个过程将针对不同的请求重复多次。
如果我只使用 1 个线程按顺序发出请求,每个请求的延迟(请求和响应之间的时间差)约为 300 毫秒。吞吐量约为每秒 3.3 个请求。
但是,由于目标是获得高吞吐量,我决定使用多个线程,每个线程在给定时间点发出请求。
一些重要的细节:
我只使用那些 URL 实例数作为线程数。这个想法是每个线程使用单个 URL 实例并在每次发出请求时调用 new URL(url).openConnection()。
每次读取响应后,我都会使用 inputStream.close() 关闭输入流,这种关闭将使套接字可重用。
我没有调用 httpConnectionURL.disconnect(),因为这将关闭底层套接字。
我已使用 System.setProperty("http.maxConnections", threadCount); 将 http.maxConnections 设置为线程数;
我还在使用“netstat -a | grep | wc -l”检查在任何给定时间点打开的连接数,这总是给出等于或高于预期的线程数的数字。
即使做了所有这些,我也没有得到预期的吞吐量。 对于 1 个线程,当我获得 3.3 的吞吐量时,我假设使用 100 个线程我应该获得至少每秒 300 的吞吐量。
谁能解释一下我哪里出错了。或任何其他更好的解决方案。 下面是我的代码 sn-p。
Main Class:
public static void main(String[] args)
{
URL[] urlConnArray = new URL[threadCount];
for(int j = 0;j < urlConnArray.length;j++)
urlConnArray[j] = new URL(regURL);
System.setProperty("http.keepalive", "true");
System.setProperty("http.maxConnections", String.valueOf(threadCount));
for(int i=0;i<1000000;i++)
{
Thread regThread = new Thread(new RegisterThread(urlConnArray[i]));
regThread.start();
}
}
RegisterThread Class:
public class RegisterThread implements Runnable
{
httpConn = (HttpURLConnection) urlConnArray[i].openConnection();
httpConn.setUseCaches(false);
httpConn.setDoOutput(true);
httpConn.setRequestMethod("POST");
httpConn.setRequestProperty("Content-Type", "application/json" );
//Prepare the request body.....
long requestTime = System.currentTimeMillis();
InputStream is = httpConn.getInputStream();
long responseTime = System.currentTimeMillis();
long latency = responseTime - requestTime;
reader = new BufferedReader(new InputStreamReader(is));
StringBuffer response = new StringBuffer();
String line = "";
while ((line = reader.readLine()) != null)
{
response.append(line);
}
is.close();
}
【问题讨论】:
标签: java multithreading url connection httpurlconnection