Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何及时停止HttpURLConnection.getInputStream?_Java - Fatal编程技术网

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

Java:如何及时停止HttpURLConnection.getInputStream?,java,Java,这是一个简单的测试程序。主线程启动多个子线程。我已在主要文件中添加: Runtime.getRuntime().addShutdownHook(hookThread) 在JVM进程上按下^C时,此钩子线程将设置一个全局关闭标志,并对所有子线程调用interrupt() 我希望所有的子线程都返回,但是interrupt()对位于HttpURLConnection.getInputStream()中的子线程不做任何操作。子线程在超时(30秒)后返回,这对我来说太延迟了 及时中断HttpURLConn

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

在JVM进程上按下^C时,此钩子线程将设置一个全局关闭标志,并对所有子线程调用interrupt()

我希望所有的子线程都返回,但是interrupt()对位于HttpURLConnection.getInputStream()中的子线程不做任何操作。子线程在超时(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)
...
“线程-0”优先级=10 tid=0x0000000040b0f800 nid=0x3eab可运行[0x000000004211b000]
java.lang.Thread.State:可运行
位于java.net.SocketInputStream.socketRead0(本机方法)
位于java.net.SocketInputStream.read(SocketInputStream.java:129)
在java.io.BufferedInputStream.fill处(BufferedInputStream.java:218)
位于java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
在java.io.BufferedInputStream.read处(BufferedInputStream.java:317)
-锁定(java.io.BufferedInputStream)
位于sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
位于sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
位于sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
-锁定(sun.net.www.protocol.http.HttpURLConnection)
...

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

您不能中断此呼叫

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


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

您不能关闭一个尚不存在的流;线程在获取流的调用中被阻塞。如果你没有引用它,你怎么能关闭它?嗯,你是对的。奇怪的是,HttpURLConnection.getInputStream()实际上需要从套接字读取。无论如何,Java在read()期间忽略中断调用,因此您建议使用NIO可能是最好的。