Java - 비동기 처리(ExecutorService / Future)

2025. 3. 4. 06:47·Java & Spring/Java

□ ExecutorService 정의

  • 여러 개의 스레드를 효율적으로 관리하고 재사용할 수 있도록 돕는 스레드 풀(Thread Pool) 관리 인터페이스
  • submit() 또는 execute()를 통해 작업을 실행할 수 있다.
  • 작업을 실행하면 Future<T> 객체를 반환하여 결과를 받을 수 있다.

 

□ Future 정의

  • ExecutorService.submit() 메서드를 호출하면 작업의 결과를 받을 수 있는 Future<T> 객체가 반환된다.
  • future.get()을 호출하면 결과를 가져올 수 있지만, 결과가 준비될 때까지 블로킹(대기) 된다.
  • 작업을 취소할 수도 있다 → future.cancel(true)

 

□ 장점

  • 스레드 풀(Thread Pool)을 관리하면서 비동기 작업을 효율적으로 수행

 

□ 단점

  • 블로킹 방식이므로 결과를 기다려야 할 수 있음

□ 실습코드

- 간단한 연산 메서드

private static double plus() throws InterruptedException {
        final long startTime = System.currentTimeMillis();
        double a = Math.round(random() * 10);
        double b = Math.round(random() * 10);
        double plus = a + b;
        Thread.sleep(100);
        log.info("{}, 소요시간: {}", plus, System.currentTimeMillis() - startTime);
        return plus;
    }

 

- get()없이 비동기 실행

public static void main(String[] args) {
        final ExecutorService executorService = Executors.newCachedThreadPool();
        final long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            executorService.submit(
                    () -> plus()
            );
        }
        log.info("메인 스레드 실행 소요시간: {}", System.currentTimeMillis() - startTime);
    }

  • 메인스레드가 우선적으로 실행됨
  • 정해진 스레드풀의 크기에서 재활용하지만 재활용 시 시간이 소요됨

- get()을 통해 비동기 작업의 값을 받아오려고 할 때

public static void main(String[] args) throws ExecutionException, InterruptedException {
        final ExecutorService executorService = Executors.newCachedThreadPool();
        final long startTime = System.currentTimeMillis();
        for(int i = 0; i < 5; i++){
            int finalI = i;
            Future<Double> future = executorService.submit(
                    () -> plus()
            );
            log.info(String.valueOf(future.get()));
        }
        log.info("메인 스레드 실행 소요시간: {}", System.currentTimeMillis() - startTime);
        Thread.sleep(3000);
        executorService.shutdown();
    }

  • 각 작업이 비동기로 실행됨
  • get()으로 인해 메인 스레드 실행 소요시간이 늦어짐

 

'Java & Spring > Java' 카테고리의 다른 글

Java - 비동기처리(CompletableFuture)  (0) 2025.03.06
Java - 비동기 처리(Thread & Runnable)  (0) 2025.03.04
HTTP 요청과 응답에 사용되는 클래스들  (0) 2025.02.06
csv파일으로 더미데이터 생성하기  (2) 2024.11.08
18일차 - Java강의(쓰레드 명령어)  (0) 2024.08.07
'Java & Spring/Java' 카테고리의 다른 글
  • Java - 비동기처리(CompletableFuture)
  • Java - 비동기 처리(Thread & Runnable)
  • HTTP 요청과 응답에 사용되는 클래스들
  • csv파일으로 더미데이터 생성하기
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 이론공부 N
        • 자격증 N
        • 개념
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • DB
      • AWS
      • CI-CD
      • 웹
      • git & github
      • 구인공고분석
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java enhance switch
    java 멤버
    개발로드맵
    프로그래머스 java 기초트레이닝
    java 세수의합
    Java this
    자료구조
    java 에라토스테네스의 체
    java 메서드
    java 유클리드 호제법
    java two-pointer
    java
    java arrays.copyofrnage()
    java기초
    Java 생성자
    데이터 타입
    java 제어자
    데이터 크기
    java super
    프로그래머스 java 기초 트레이닝
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
Java - 비동기 처리(ExecutorService / Future)
상단으로

티스토리툴바