나는 다른 프록시를 사용하여 인터넷에서 일부 이미지를 다운로드 스레드가 있습니다. 가끔 중단되어 어떤 방법으로도 죽일 수 없습니다.난 그냥 자바 스레드를 죽일 수 없다
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 %가 필요했습니다.
스레드를 죽이는 것은 불가능합니다.
디버거를 여는 동안 목 주위에 약간의 마늘을 착용하고 거룩한 물을 뿌린 다음 나무의 스테이크를 프로세스의 심장에 부딪쳐 마침내 머리를 자르고 잔해를 태 웁니다. 이것이 유일한 방법입니다. (또는 궤도에서 핵을 터뜨려주세요.) –
@Jeffrey L Whitledge : 예, 그렇습니다. 그런 다음 죽은 스레드가 자물쇠에 열쇠를 쥐고 소각되도록하기 때문에 20 개 이상의 스레드가 교착 상태에있는 것으로 나타났습니다. 객체가 일관성없는 상태에 있기 때문에 아무도 더 이상 릴리스 할 수 없습니다. –