자바에서의 비동기는 뭘까?

빙그르·2024년 1월 24일

JAVA

목록 보기
11/11

JS에서는 async await를 쓰지
java에서는 ExecutorService(I/O bound) ForkJoinPool(CPU bound)를 이용한다.

CPU bound :: 일반적으로 연산이 많이 필요한 로직
I/O bound :: 로컬 파일 시스템 혹은 네트워크 통신이 많은 로직

ExecutorService

ExecutorService는 IO 바운드 작업과 CPU 바운드 작업을 포함하여 더 넓은 범위의 작업을 지원하는 보다 일반적인 인터페이스입니다. 작업을 스레드 풀에 제출하고, 스레드 풀을 관리하고, 스레드 풀을 종료하기 위한 메서드를 제공합니다.

ForkJoinPool

ForkJoinPool은 CPU 바운드 작업을 위해 설계된 ExecutorService의 특수 구현입니다. 작은 하위 작업으로 분할할 수 있는 작업을 위해 사용됩니다. 작업 스틸링 알고리즘을 사용하여 사용 가능한 스레드 간에 작업을 동적으로 분배하므로 특정 유형의 작업에 성능을 향상시킬 수 있습니다.

ExecutorService와 ForkJoinPool을 언제 사용해야 하는지

  • 다음과 같은 작업에는 ExecutorService를 사용합니다.
    • IO 바운드 작업
    • 하위 작업으로 쉽게 분할할 수 없는 작업
    • 특정 실행 순서가 필요하지 않은 작업
  • 다음과 같은 작업에는 ForkJoinPool을 사용합니다.
    • CPU 바운드 작업
    • 하위 작업으로 쉽게 분할할 수 있는 작업
    • 특정 실행 순서가 필요한 작업

ExecutorService와 ForkJoinPool은 모두 유용한 도구이지만 서로 다른 작업 유형에 적합합니다. ExecutorService는 더 일반적인 목적으로 사용할 수 있는 반면 ForkJoinPool은 CPU 바운드 작업을 병렬로 실행하는 데 특히 유용합니다.

// API 호출 병렬로 실행
ExecutorService executor = Executors.newFixedThreadPool(2);	// 스레드 2개 열기
responseDataVo = executor.submit(() -> geResult(travelVo, false)).get();
test = executor.submit(() -> testAPI(travelVo)).get();
executor.shutdown();	// 꼭 닫아줘야 한다. (작업이 완료되면 닫아줘)
//  executor.isTerminated(); // 만약에 작업이 종료되었다면 bool 형식으로 반환함
// executor.shutdownNow(); // 강제 종료 시켜줘

0개의 댓글