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

标签 java

这是一个简单的测试程序。主线程启动了多个子线程。我已经添加到主要: 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 错误 #4514257 ,在任何 InputStream.read() 上调用 Thread.interrupt() 失败。

关于Java:如何及时停止HttpURLConnection.getInputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10037462/

相关文章:

java - 在 Java Swing 中缩放 JPanel

java - 从执行器指标中排除路径参数

java.net.SocketException : Connection reset by peer: socket write error When transmitting Audio

java - 使用 Selenium 单击 div 标签内具有属性角色的按钮

java - JTable 遮住了按钮,布局编辑需要帮助

java - 如何使用java lambdas将n个字符附加到字符串中?

java - JPA - 如何在不构造父对象的情况下构造 ManyToOne 关系的子对象

java - Spring 卡夫卡 : Read from two different topics in order

java - 希望将坐标列表导出到 gpx 文件

c# - 如何在CUBRID数据库中用C#调用Java存储过程