首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:如何及时停止HttpURLConnection.getInputStream?

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

Stack Overflow用户
提问于 2012-04-06 07:34:34
回答 2查看 2.4K关注 0票数 3

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

当^C在JVM进程上被按下时,这个中断将设置一个全局关闭标志,并对所有子线程调用hookThread ()。

我希望所有的子线程都返回,但是如果子线程在HttpURLConnection.getInputStream()中,interrupt()不会对子线程做任何事情。子线程在超时(30秒)后返回,这对我来说是一个很大的延迟。

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

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

代码语言:javascript
运行
复制
"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)
...
EN

回答 2

Stack Overflow用户

发布于 2012-04-06 07:52:12

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-06 09:49:58

你不能打断这通电话。

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

此外,您应该只中断您拥有的线程。如果您创建了进程中的每个线程,并了解它们如何响应中断,这是可以接受的,但如果不这样做,盲目中断线程是很危险的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10037462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档