2010-04-14 4 views
4

나는 다른 프록시를 사용하여 인터넷에서 일부 이미지를 다운로드 스레드가 있습니다. 가끔 중단되어 어떤 방법으로도 죽일 수 없습니다.난 그냥 자바 스레드를 죽일 수 없다

public HttpURLConnection uc; 
public InputStream in; 

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("server", 8080)); 
URL url = new URL("http://images.com/image.jpg"); 
uc = (HttpURLConnection)url.openConnection(proxy); 
uc.setConnectTimeout(30000); 
uc.setAllowUserInteraction(false); 
uc.setDoOutput(true); 
uc.addRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); 
uc.connect(); 

in = uc.getInputStream(); 

응답이 없으면 uc.getInputStream() 메서드에서 고정됩니다. 실행 시간이 3 분을 초과하면 스레드를 죽이려는 타이머를 만들었습니다. 스레드를 .terminate() 시도했습니다. 효과가 없습니다. 나는 주 스레드에서 uc.disconnect()을 시도했다. 이 메소드는 또한 메인 쓰레드와 매달린다. 나는 in.close()을 시도했다. 효과가 없습니다. uc=null, in=null은 스레드를 종료하는 예외를 원했습니다. 계속 실행됩니다. uc.getInputStream() 메서드를 전달하지 않습니다.

마지막 테스트에서 스레드는 위의 모든 명령 (또는 다양한 조합)을받은 후 14 시간 이상 지속되었습니다. 스레드를 중지하려면 Java 프로세스를 종료해야했습니다.

방금 ​​스레드를 무시하고 인스턴스를 null로 설정하면 스레드가 죽지 않고 가비지 수집기에서 지워지지 않습니다. 나는 그것이 며칠 동안 실행되는 응용 프로그램을 허용하기 때문에 Java 프로세스가 점점 더 많은 시스템 메모리를 사용하기 때문에 그 사실을 알고 있습니다. 3 일 동안 내 8Gb 시스템 RAM의 10 %가 필요했습니다.

스레드를 죽이는 것은 불가능합니다.

+2

디버거를 여는 동안 목 주위에 약간의 마늘을 착용하고 거룩한 물을 뿌린 다음 나무의 스테이크를 프로세스의 심장에 부딪쳐 마침내 머리를 자르고 잔해를 태 웁니다. 이것이 유일한 방법입니다. (또는 궤도에서 핵을 터뜨려주세요.) –

+1

@Jeffrey L Whitledge : 예, 그렇습니다. 그런 다음 죽은 스레드가 자물쇠에 열쇠를 쥐고 소각되도록하기 때문에 20 개 이상의 스레드가 교착 상태에있는 것으로 나타났습니다. 객체가 일관성없는 상태에 있기 때문에 아무도 더 이상 릴리스 할 수 없습니다. –

답변

3

uc.setReadTimeout(30000);

+0

그것은 작동합니다. 감사. – Adrian

4

스레드 무엇을 죽일 불가능 설정 시도?

대부분의 경우 예 - 스레드가 인터럽트 불가능 IO에서 차단 된 경우 특히 그렇습니다. 다른 스레드에서 uc.getInputStream().close() (으)로 전화를 걸어 차단을 해제 할 수 있습니다. 그것은 스레드로부터 안전하지 않을 수도 있습니다. HttpUrlConnection에도 setReadTimeout()이 있습니다.

0

아니요. 외부에서 스레드를 죽이는 것은 본질적으로 안전하지 않은 작업입니다.

당신이 할 수있는 일은 자발적으로 스스로를 닫는 것입니다. 시간 초과가 초과되면 다운로드 스레드가 종료되도록 작성하십시오.

+0

내가하고 싶었지만 API 함수에서 쓰레드가 멈췄다. 난 동결 후 API를 메서드를 동결로 인해 절대로 실행되지 않기 때문에 내가 동결 (나는 "살아있는 == 사실) 동안"(할 수 없다 "살아있는 = false를 설정할 때 말할 수 없다) . – Adrian

4

(다른 응답에서 언급 한) 읽기 타임 아웃을 설정하는 것과 함께 스레드를 인터럽트 했습니까?

+0

좋은 제안; 그것은'java.io.InterruptedIOException'을 멈추고'getInputStream'이 그 종류의 것을 던질 수있는 것으로 문서화되는 곳에서부터 발사 할 것입니다. (글쎄, 그것의 슈퍼 클래스.) –

관련 문제