본문 바로가기
프로그래밍/Java & Spring

CompletableFuture와 daemon Thread

by 방구석개발자 2022. 9. 2.
반응형

기본적으로 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://stackoverflow.com/questions/42439198/why-is-completablefuture-supplyasync-succeeding-a-random-number-of-times

https://widevery.tistory.com/32

https://medium.com/@lunay0ung/thread-daemon-thread-3b89ce606b04

반응형

댓글