在Java中,线程在SocketRead0中挂起,我该怎么办?

时间:2011-07-02 13:14:34

标签: java multithreading web-crawler inputstream httpurlconnection

我正在开发一个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;
    }

2 个答案:

答案 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。