我正在开发一个webcrawler,但经常在执行一小段时间后(分钟),一些线程停止工作。运行调试器,我发现它在SocketRead0中停止。
当线程下载带有HttpURLConnection.getInputStream()
的页面内容时会发生这种情况。
我不知道是什么导致这种情况,但我认为这与多线程有关。
有人知道如何解决或避免这种情况?
我没有使用HttpURLConnection池但是我不知道该怎么做。
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setInstanceFollowRedirects(true);
conn.connect();
CountingInputStream content;
try {
content = new CountingInputStream(conn.getInputStream());
//processing of content
content.close();
return true;
} catch (Exception e) {
return false;
}
答案 0 :(得分:4)
您需要在连接上设置套接字读取超时。这将导致它抛出异常而不是在指定的时间段后挂起。
http://download.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout(int)
答案 1 :(得分:3)
您正在使用的服务器可能没有按预期发送数据,并且您的线程被等待数据。
您正在使用的原始java.io.*
类是阻止 I / O实现,这意味着如果没有可用于读取的数据,InputStream.read()
之类的方法将暂停该线程 - 呼叫等待直到有数据,如果到达则方法返回。
在Java 1.4中,添加了java.nio
包,这是一个非阻塞 I / O实现。如果您使用的服务器可能无法可靠地运行,我建议您使用它。 Here are some examples如何使用nio。