【问题标题】:HttpURLConnection getting lockedHttpURLConnection 被锁定
【发布时间】:2010-06-08 16:35:23
【问题描述】:

我在 tomcat 下运行一个线程,它创建一个 HttpUrlConnection 并通过 BufferedInputStream 读取它。

在获取某些 url 的数据后,它会停止。我得到了进程的 jstack,它说 HttpUrlConnection 被锁定并且 BufferedInputStream 也被锁定。

"http-8080-1" daemon prio=10 tid=0x08683400 nid=0x79c9 runnable [0x8f618000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
        - locked <0x956ef8c0> (a java.io.BufferedInputStream)
        at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
        at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1072)
        - locked <0x956ef910> (a sun.net.www.protocol.http.HttpURLConnection)

有人可以帮忙吗? 谢谢

【问题讨论】:

    标签: java locking httpurlconnection


    【解决方案1】:

    您可能在另一端遇到问题。 InputStream 上的 read() 是一个阻塞操作 - 来自 javadoc (http://java.sun.com/javase/6/docs/api/):“此方法阻塞,直到输入数据可用、检测到流结束或引发异常。”

    另一端的服务器有响应吗?你知道它有没有发送任何东西吗?

    编辑:为了更清楚,线程处于 RUNNABLE 状态,所以你没有死锁 - 听起来你就是这么想的,但这里没有任何死锁的证据。

    【讨论】:

    • 从日志看来它是从一些 xyz url 读取的。我尝试使用 wget 并且可以很快得到响应。我不确定 read() 阻塞的原因是什么。还有一件事,我导入了java.net.HttpURLConnection,但堆栈跟踪显示了其他一些包。有什么线索吗?
    • 我建议尝试 Apache 的 HTTP 客户端:hc.apache.org/httpclient-3.x 而不是 Sun 的。我都没有这方面的经验,但是一些快速搜索表明 Apache 的要好得多。
    • @Nayn:堆栈跟踪中的“其他包”是 Sun 的内部实现。
    • @nojo 我也遇到了同样的问题,请确认问题出在另一端吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多