2012-04-05 3 views
3

이것은 간단한 테스트 프로그램에 있습니다. 주 스레드는 여러 개의 자식 스레드를 시작합니다. 메인에 추가했습니다 : 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) 
... 

답변

1

당신은 아마 스트림을 종료해야합니다. Java 버그 #4514257에 따라 InputStream.read()에서 Thread.interrupt()를 호출하면 실패합니다.

+0

아직 존재하지 않는 스트림을 닫을 수 없습니다. 스레드는 * get * 스트림 호출에서 차단됩니다. 참조가 없다면 어떻게 닫을 수 있습니까? – erickson

+0

흠, 네 말이 맞아. HttpURLConnection.getInputStream() 실제로 소켓에서 읽는 것이 필요하다는 것이 이상합니다. 그럼에도 불구하고 Java는 read() 중에 인터럽트 호출을 무시하므로 NIO를 사용하는 것이 가장 좋습니다. –

1

이 호출을 중단 할 수 없습니다.

전화를 걸기 전에 시간 제한을 더 짧게 설정하거나 NIO 패키지를 통해 인터럽트 가능 I/O를 지원하는 HTTP 클라이언트 라이브러리를 찾을 수 있습니다.

또한 소유하고있는 스레드 만 중단해야합니다. 프로세스의 모든 스레드를 생성하고 인터럽트에 어떻게 반응 하는지를 이해한다면 괜찮습니다. 그렇지 않으면 맹목적으로 스레드를 인터럽트하는 것은 위험합니다.

관련 문제