복붙노트

[SPRING] jUnit 테스트에서 데몬이 아닌 스레드가 종료되는 이유는 무엇입니까?

SPRING

jUnit 테스트에서 데몬이 아닌 스레드가 종료되는 이유는 무엇입니까?

다음 디먼 Bean이 실행 중입니다.

public class DaemonBean extends Thread {

    private final static Logger log = LoggerFactory.getLogger(DaemonBean.class);

    {
        setDaemon(true);
        start();
    }

    @Override
    public void run() {

        for(int i=0; i<10 && !isInterrupted(); ++i) {
            log.info("Hearbeat {}", i);
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                return;
            }
        }

    }
}

데몬이므로 싱글 톤이면 종료됩니다.

따라서 다음 비 데몬 콩이 그를 기다리고 있습니다.

public class Waitor1 extends Thread {

    private final static Logger log = LoggerFactory.getLogger(Waitor1.class);

    private Thread joinable;

    {
        setDaemon(false);
        setUncaughtExceptionHandler(new UncaughtExceptionHandler() {

            @Override
            public void uncaughtException(Thread t, Throwable e) {
                log.error("Error in thread", e);
            }
        });
    }

    public Thread getJoinable() {
        return joinable;
    }

    public void setJoinable(Thread value) {
        this.joinable = value;
        if( this.joinable != null ) {
            start();
        }
    }

    @Override
    public void run() {

        log.info("Waiting started");

        try {
            joinable.join();
        } catch (InterruptedException e) {
            log.info("Thread interrupted");
            return;
        }

        log.info("Waiting ended");

    }

}

Bean의 Spring 구성은 다음과 같습니다.

<bean id="daemon" class="beans.DaemonBean"/>

    <bean id="waitor" class="beans.Waitor1">
        <property name="joinable" ref="daemon"/>
    </bean>

문제는 : main에서 실행하면 jUnit 테스트에서 실행하면 작동하지 않는 이유는 무엇입니까?

실행중인 코드는

 public static void main(String[] args) {
        new ClassPathXmlApplicationContext("/beans/Waiting1.xml");
    }

또는

@Test
    public void testWaiting1() {
        new ClassPathXmlApplicationContext("/beans/Waiting1.xml");
    }

메인의 경우 모든 하트 비트가 표시됩니다. jUnit의 경우 하트 비트 0 만 표시되고 "Waiting Started"메시지가 표시되고 여기에서 데몬이 아닌 스레드를 기다리는 사람이없는 것처럼 프로그램이 종료됩니다.

그 이유는 무엇입니까?

해결법

  1. ==============================

    1.main에서 코드를 실행하면 두 bean, 즉 데몬과 비 데몬 두 스레드가 생성됩니다. 비 데몬 스레드가 실행되는 한 응용 프로그램이 종료되지 않습니다. 그래서 작동합니다.

    main에서 코드를 실행하면 두 bean, 즉 데몬과 비 데몬 두 스레드가 생성됩니다. 비 데몬 스레드가 실행되는 한 응용 프로그램이 종료되지 않습니다. 그래서 작동합니다.

    JUnit에서 실행할 때 다릅니다. JUnit 테스트 메소드가 완료되고 (Spring 컨텍스트가 완료된 직후 완료 됨) JUnit은 테스트가 완료된 것으로 가정합니다. 따라서 모든 스레드와 기본적으로 전체 JVM을 종료합니다.

    Waitor1 Bean은 JUnit이 신경 쓰지 않는 백그라운드 스레드를 생성합니다. @Test 메소드를 떠나 자마자 JUnit은 모든 것을 중지합니다.

  2. from https://stackoverflow.com/questions/13550922/why-non-daemon-thread-is-terminating-if-in-junit-test by cc-by-sa and MIT license