이것은 간단한 테스트 프로그램에 있습니다. 주 스레드는 여러 개의 자식 스레드를 시작합니다. 메인에 추가했습니다 : Runtime.getRuntime(). addShutdownHook (hookThread);자바 : 즉시 HttpURLConnection.getInputStream을 중지 하시겠습니까?
JVM 프로세스에서^C를 누르면이 hookThread가 전역 종료 플래그를 설정하고 interrupt()를 모든 하위 스레드로 호출합니다.
모든 하위 스레드를 반환하고 싶지만 interrupt()가 HttpURLConnection.getInputStream()에있는 경우 하위 스레드에는 아무 것도 실행하지 않습니다. 자식 스레드는 제한 시간 (30 초) 후에 반환되며 너무 지연됩니다.
HttpURLConnection.getInputStream() 호출을 즉시 중단하는 가장 좋은 방법은 무엇입니까? 거기에 호출 된 인터럽트 후 아이 thread의 스택의 상단() 다음
:
"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)
...
아직 존재하지 않는 스트림을 닫을 수 없습니다. 스레드는 * get * 스트림 호출에서 차단됩니다. 참조가 없다면 어떻게 닫을 수 있습니까? – erickson
흠, 네 말이 맞아. HttpURLConnection.getInputStream() 실제로 소켓에서 읽는 것이 필요하다는 것이 이상합니다. 그럼에도 불구하고 Java는 read() 중에 인터럽트 호출을 무시하므로 NIO를 사용하는 것이 가장 좋습니다. –