반응형
기본적으로 CompletableFuture 내부적으로 ForkJoinPool.commonPool() 을 사용합니다. (구현 참조 CompletableFuture).
그리고 ForkJoinPool.commonPool()은 데몬 스레드만 생성합니다.
jvm은 데몬 스레드의 종료를 기다리지 않습니다.
jvm이 종료되는 과정에서 실행중인 데몬스레드가 있다면 그냥 죽인다.
그래서 join, get으로 기다리게끔 처리하여야 로직에서 계속 처리를 기다린다.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.time.LocalDateTime;
import java.util.concurrent.*;
public class CompletableFutureTest
{
@DisplayName("CompletableFuture에서 sleep후 잘 동작되는지 테스트")
@Test
void threadSleepTest()
{
CompletableFuture.runAsync(() ->{
for (int i = 0; i < 5; i++)
{
System.out.println(LocalDateTime.now());
threadSleepForMilliseconds(10000);
}
}).join();
}
@DisplayName("2분동안 10초에 한번씩 작업하는지 검증")
@Test
void RequestTimeTest()
{
CompletableFuture.runAsync(() -> {
LocalDateTime requestTime = LocalDateTime.now();
while (LocalDateTime.now().minusMinutes(2).isBefore(requestTime))
{
System.out.println(LocalDateTime.now());
threadSleepForMilliseconds(10000);
}
}).join();
}
private void threadSleepForMilliseconds(long millis)
{
try
{
Thread.sleep(millis);
}
catch (InterruptedException e)
{
throw new InternalServiceException(ExceptionCode.SYSTEM_INTERNAL_ERROR);
}
}
}
참고
https://widevery.tistory.com/32
https://medium.com/@lunay0ung/thread-daemon-thread-3b89ce606b04
반응형
'프로그래밍 > Java & Spring' 카테고리의 다른 글
Spring Cloud Service Discorvery (0) | 2023.03.25 |
---|---|
gradle test코드를 패키지 단위로 제외시키는 방법 (0) | 2022.09.16 |
Java Spring OOM 분석 및 해결 후기 (0) | 2022.08.18 |
Flyway 에러처리 (0) | 2022.06.16 |
configuration test 대체하기 (0) | 2022.05.07 |
댓글