【问题标题】:Java: How to promptly stop HttpURLConnection.getInputStream?Java:如何及时停止 HttpURLConnection.getInputStream?
【发布时间】:2013-12-08 04:17:43
【问题描述】:

这是一个简单的测试程序。主线程启动多个子线程。我已添加到主要: Runtime.getRuntime().addShutdownHook(hookThread);

当 JVM 进程按下 ^C 时,此 hookThread 将设置一个全局关闭标志,并调用 interrupt() 到所有子线程。

然后我希望所有子线程都返回,但是如果子线程位于 HttpURLConnection.getInputStream() 中,则 interrupt() 对子线程没有任何作用。子线程在超时(30 秒)后返回,这对我来说延迟太大了。

立即中断 HttpURLConnection.getInputStream() 调用的最佳方法是什么?

在调用了interrupt()之后跟随子线程堆栈的顶部:

"Thread-0" prio=10 tid=0x0000000040b0f800 nid=0x3eab runnable [0x000000004211b000]
   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 <0x00000000fd99ac88> (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:1195)
        - locked <0x00000000fd997670> (a sun.net.www.protocol.http.HttpURLConnection)
...

【问题讨论】:

    标签: java


    【解决方案1】:

    您可能必须关闭流。根据 Java 错误 #4514257,在任何 InputStream.read() 上调用 Thread.interrupt() 都会失败。

    【讨论】:

    • 你不能关闭一个还不存在的流;线程在调用 get 流时被阻塞。没有引用怎么关闭呢?
    • 嗯,你是对的。奇怪的是 HttpURLConnection.getInputStream() 实际上需要从套接字读取。无论如何,Java 在 read() 期间会忽略中断调用,因此您建议使用 NIO 可能是最好的。
    【解决方案2】:

    你不能打断这个电话。

    您可以在调用之前设置一个较短的超时时间,或者您可能会通过 NIO 包找到支持可中断 I/O 的 HTTP 客户端库。

    此外,您应该只中断您拥有的线程。如果您在进程中创建了每个线程并了解它们如何响应中断,那没关系,但否则盲目中断线程是危险的。

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多