这是一个简单的测试程序。主线程启动多个子线程。我在main中添加了: Runtime.getRuntime().addShutdownHook(hookThread);
当^C在JVM进程上被按下时,这个中断将设置一个全局关闭标志,并对所有子线程调用hookThread ()。
我希望所有的子线程都返回,但是如果子线程在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)
...
发布于 2012-04-05 23:52:12
您可能必须关闭流。根据Java bug #4514257,在任何InputStream.read()上调用Thread.interrupt()都会失败。
发布于 2012-04-06 01:49:58
你不能打断这通电话。
您可以在进行调用之前设置一个较短的超时时间,或者您可以找到一个通过NIO包支持可中断I/O的HTTP客户端库。
此外,您应该只中断您拥有的线程。如果您创建了进程中的每个线程,并了解它们如何响应中断,这是可以接受的,但如果不这样做,盲目中断线程是很危险的。
https://stackoverflow.com/questions/10037462
复制相似问题