2012-10-26 3 views
2

Ctrl-C를 사용하여 강제 종료하려는 다중 스레드 Java 콘솔 응용 프로그램을 작성 중입니다. 이 상황에서 단일 스레드를 캡슐화하는 클래스가있는 경우 캡슐화 클래스에서 자식 스레드를 종료하는 것이 좋습니다.자바는 자식 스레드 종료를 위해 finalize를 사용합니까?

원래 응용 프로그램을 Ctrl-C로 누르고 모든 스레드가 제대로 종료되지 않으면 원래 응용 프로그램의 아티팩트가 남아있을 수 있습니까?

의사 코드 :

public class ParentClass { 

Thread childThread = new Thread(new ExampleRunnable()); 

    @Override protected void finalize() throws Throwable { 
    childThread.shutdown(); 
    } 
} 

public class ExampleRunnable implements Runnable { 

private volatile boolean alive = false; 

@Override 
public void run() { 
    alive = true; 
    while(alive) { 
    //do some work 
    } 
} 

    public void shutdown() { 
    alive = false; 
    } 
} 
+1

finalize 메서드가 실행된다는 보장은 없습니다. 또한 모든 스레드가 JVM에 의해 제어된다는 점에 유의하십시오. JVM이 꺼지면 모든 스레드도 종료됩니다. –

+0

물론, 그렇지만 상처를 입히거나 상상할 수있는 상황이 있습니까? –

+1

제공된 예제에서는 결코 실행되지 않을 수도있는 노력을 추가하는 것과 같습니다. –

답변

3

finalize을 구현하는 것은 정말 나쁜 부작용이있을 수 있습니다. 다시 생각해 보면, Java는 느린 편이었으며 이유 중 하나는 지금까지 만들어진 모든 객체에 finalize을 실행해야한다는 것입니다. 이제 JVM은 수집되는 모든 객체에서 맹목적으로 호출하는 것이 아니라 매우 단순한 finalize 구현이 있는지 확인하기에 충분히 똑똑합니다. 하나의 클래스를 구현하면 finalize이 좋지 않을 수도 있지만 습관을 들여서는 안됩니다.

정상적인 JVM 종료 중에 특별한 작업을 수행하려면 shutdown hook을 사용하십시오.

+0

특정 스레드에서 특별한 작업을하지 않아도 명시 적으로 종료하지 않는 것이 안전합니까? 간단한 스레드에 대한 꽤 일반적인 연습인가요? –

+0

응용 프로그램의 모든 스레드에 대한 종료 훅 (hook)이 없으면 나쁜 관행으로 찌그러져 보입니까? –

+0

스레드가 수행하는 작업에 따라 다릅니다. 대부분의 자바 프로그래머는'new Thread'보다는'ThreadPoolExecutor'를 사용한다고 말합니다. 솔직히, 나는 응용 프로그램이 자연스럽게 끝내는 것 이상의 방법에 대해 생각하는 많은 사람들을 만난 적이 없다. 사실 저는 프레임 워크없이 서비스를 작성하는 사람들과 함께 일했으며 정리를하지 않고 애플리케이션을 죽게했습니다. 모든 스레드에 대해 종료 훅을 추가하는 것이 정상이라고는하지 않습니다. 나는 디스크에 데이터를 위탁하거나 네트워크 연결을 깨끗이 종료하는 것과 같은 최종 조치가 취해 지도록 셧다운 훅 (hook)을 사용하는 것이 아이디어라고 생각한다. –