자바 쓰레드를 배운 사람들이라면 아래 코드가 2초 이후에 프로세스가 종료된다는 것을 알 것이다.
package hello;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MainMethodUserThreadTest {
public static void main(String[] args) {
new Thread(() -> {
try {
log.info("2 second wait start!");
Thread.sleep(2000);
log.info("2 second wait done!");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).start();
log.info("main End!");
}
}
그리고 아래 코드는 데몬 쓰레드를 사용해서, 2초를 기다리지 않고
메인 쓰레드가 할 일을 끝내면 프로세스가 곧바로 종료된다는 것도 알 것이다.
package hello;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MainMethodUserThreadTest {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
try {
log.info("2 second wait start!");
Thread.sleep(2000);
log.info("2 second wait done!");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
thread.setDaemon(true);
thread.start();
log.info("main End!");
}
}
너무나도 당연한 결과다.
그런데 위 코드와 비슷하게 짠 코드를 Junit
에서 돌리면 어떨까?
package hello;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
@Slf4j
public class JunitMethodUserThreadTest {
@Test
void userThreadAliveTest() {
Thread thread = new Thread(() -> {
try {
log.info("2 second wait start!");
Thread.sleep(2000);
log.info("2 second wait done!");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
thread.start();
log.info("main End!");
}
}
실제 실행결과는 아래와 같다.
처음에는 진짜로 "나 쓰레드 잘못 배웠나?"했다.
하지만 다행히 그게 아니였다!
검색 결과 이 글을 발견하게 되었다.
글의 내용을 요약하자면 아래와 같다.
그렇다! Junit 테스트 환경의 특성 때문에 발생한 일인 것이다!
오늘도 지식 +1
!