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

  • 최근 글

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

티스토리툴바