Java에서 비동기 요청 처리방법

개발 99·2025년 6월 15일

1. 비동기 요청 처리방법


( https://adjh54.tistory.com/544 )

이러한 비동기 작업은 별도의 스레드에서 실행이 되며, 메인 스레드가 블로킹되지 않도록 합니다.
즉, 메인 스레드가 특정 작업을 기다리느라 멈추지 않고, 다른 작업을 계속해서 수행할 수 있습니다.

1.2 그렇다면, 자바에선 어떤 스레드가 비동기 요청 처리할까?

a. ForkJoinPool(병렬 처리) -> 큰 작업을 잘게 쪼개어.

	// ComputableFuture를 통해서 비동기 요청으로 처리할 수 있다.
    // 또한 아래 출력값은 별도의 스레드임을 알 수 있다.
    // ForkJoinPool의 commonPool()을 사용해 작업을 실행할 쓰레드를 쓰레드 풀로부터 얻어 실행시킨다.
    // 만약 원하는 쓰레드 풀을 사용하려면, ExecutorService를 파라미터로 넘겨주면 된다.
    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
        System.out.println("Thread: " + Thread.currentThread().getName());
    });

    future.get();
    System.out.println("Thread: " + Thread.currentThread().getName());
  • fork 호출시
  1. 작업을 작은 서브 task로 분할 한 후, 분할된 작업은 ForkJoinPool의 스레드 데큐에 추가가 된다.

  2. 각 스레드는 자신의 deque에서 작업을 가져와 처리한다.

  • join 호출시
  1. 이전에 fork한 다른 작업의 완료를 기다림.
    마지막에 병합.
  • 작업 훔치기
    스레드에 작업이 없으면 다른 작업의 데큐에서 테스크를 훔쳐 실행을 한다.( 리소스 사용률 극대화 )

자바에선 Stream의 ParrallelStream이 ForkJoin을 사용한다.

ForkJoinPool.commonPool()은 JVM 당 1개만 존재하며, 전반의 병렬 스트림 연산에 사용.
( 스트림의 원소들은 작은 테스크로 분할되어 ForkJoinTask로 감싸진 후, ForkJoinPool에 제출되어 처리.)

개수는 물리적 CPU 코어 수, 또는 논리적 프로세스 수(하이퍼스레딩이 활성화된 경우)

공용 풀에 다른 작업을 위해 최소한 하나의 스레드를 남견다.

단, 작업이 완료될 때까지 공용 풀로 반환이 되지 않는다.

b. ExcutorService

  • Excutor : 쓰레드를 미리 만들어두고 재사용하기 위한 쓰레드 풀의 인터페이스
    ( 등록된 작업을 실행하는 책임 = 전달받는 작업(Runnable)만 실행)

  • ExcutorService : 작업 등록을 위한 인터페이스
    Excutor를 상속받아서 작업 등록 뿐만 아니라 실행을 위한 책임도 있다.
    ( ThreadPool의 기본은 ExcutorService를 구현)

  • ScheduledExecutorService : 특정 시간 이후에 또는 주기적으로 작업을 실행시키는 메소드, 스케줄링

  • Executors : 위를 만들어주는 팩토리 클래스.

스레드 풀

  1. 애플리케이션(Application)
  • 비동기 처리의 하나의 새로운 작업(New Task)을 발생시켰고, 이를 작업 큐로 제출(Submit)을 하게 됩니다.
  1. 작업 큐(Task Queue)
  • 전달받은 작업(Task)은 큐에서 스레드의 사용이 가능할 때까지 보관을 합니다.
  • 또한 큐에서는 FIFO 형태로 먼저 들어온 데이터가 먼저 처리하는 구조를 가지며 순차적으로 데이터가 쌓이고 들어온 순서대로 처리가 수행됩니다.
  1. 스레드(Thread)
  • 스레드 풀에 있는 스레드 중 하나가 사용이 가능해지면, 작업 큐에서 작업을 가져와서 실행을 하게 됩니다.
  • 작업이 완료되면, 스레드는 유휴 상태가 되며, 작업이 발생하면 다시 큐에서 다음 작업을 가져와서 처리를 합니다.
profile
구구구구구!

0개의 댓글