HttpURLConnection 导致线程阻塞

QQ截图20150522173145

 

最近写一个爬虫类程序,定时启动线程,在线程中用HttpURLConnection的方式获取HTML代码,程序设置了循环标志位,到时会自动改变标志位,循环结束,线程自动结束,但是线程并没有结束,查看线程一直处于alive状态。

后来找了各种原因,也排除各种原因,最后用jconsole发现了问题。

最初的代码是这样的:


public String getSource(URL url) throws Exception
{
HttpURLConnection conn;
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream(); // 通过输入流获取html二进制数据
byte[] data = readInputStream(inStream); // 把二进制数据转化为byte字节数据
String htmlSource = new String(data);
return htmlSource;
}

知道问题出在这部分也就好办了,原来HttpURLConnection 还有个方法是setReadTimeout,这个是读取超时,有了这个也不就会导致线程一直卡在这里了。

顺便对InputStream和HttpURLConnection进行是了释放和关闭。

修改后:

public String getSource(URL url) throws Exception
{
HttpURLConnection conn;
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
conn.setReadTimeout(10 * 1000);
InputStream inStream = conn.getInputStream(); // 通过输入流获取html二进制数据
byte[] data = readInputStream(inStream); // 把二进制数据转化为byte字节数据
String htmlSource = new String(data);
conn.disconnect();
inStream.close();
return htmlSource;
}