Java:如何及时停止HttpURLConnection.getInputStream?

时间:2012-04-05 23:34:34

标签: java

这是一个简单的测试程序。主线程启动了许多子线程。我添加到main: 。调用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)
...

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您无法中断此通话。

您可以在拨打电话之前设置较短的超时时间,或者您可能会找到支持通过NIO包进行可中断I / O的HTTP客户端库。

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