【问题标题】:In Java, thread hangs in SocketRead0, what can I do?在 Java 中,线程挂在 SocketRead0 中,我该怎么办?
【发布时间】:2011-09-27 06:49:59
【问题描述】:

我正在开发一个网络爬虫,但通常在执行短时间(几分钟)后,一些线程会停止工作。运行调试器,发现它停在了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;
    }

【问题讨论】:

  • 首先发布一些代码 - 没有人可以看到你做了什么,所以没有人可以提出修复建议。
  • 爬取线程是否可能实际上正在等待来自远程服务器的数据?我会用 NIO 来做这些事情。
  • @duffymo 我添加了一些代码。连接打开到服务器,线程停止在conn.getInputStream()
  • 我正在使用 HttpURLConnection 开发网络爬虫。忘了它。至于您的问题,您可以等待连接超时或调用 Thread.interrupt
  • @bestsss 你推荐使用什么?

标签: java multithreading web-crawler inputstream httpurlconnection


【解决方案1】:

您需要在连接上设置套接字读取超时。这将导致它在指定的时间段后抛出异常而不是挂起。

http://download.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout(int)

【讨论】:

  • 工作,但是线程在打开与服务器的连接时挂起,而不是在阅读时,所以我使用了setConnectTimeout()。非常感谢。
【解决方案2】:

您正在使用的服务器可能没有按照您的预期发送数据,并且您的线程在等待数据时被阻塞。

您使用的原始java.io.* 类是一个阻塞 I/O 实现,这意味着如果没有数据可供读取,像InputStream.read() 这样的方法将停止线程 - 调用等待直到有数据,如果到达,方法返回。

在 Java 1.4 中,添加了 java.nio 包,这是一个非阻塞 I/O 实现。如果您使用的服务器可能无法可靠地提供服务,我建议您使用它。 Here are some examplesnio的使用方法。

【讨论】:

  • 太麻烦了,只为超时切换到nio。 io 也有超时设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2021-10-01
  • 2012-05-05
  • 2012-08-30
  • 2021-11-26
  • 2022-08-07
相关资源
最近更新 更多