[Java] ExecutorService를 이용한 비동기 처리

해니·2023년 11월 27일
0

Java

목록 보기
6/34
post-thumbnail

Thread와 Runnable을 이용한 Thread 생성

  • 자바로 스레드를 생성할 경우, 아주 기본적으로는 Thread 클래스와 Runnable 함수형 인터페이스를 구현해 Thread를 생성한다.
  • Thread와 Runnable의 한계점
    • 지나치게 저수준의 API(쓰레드의 생성)에 의존한다.
    • 쓰레드의 작업이 끝난 후 결과를 반환 받는 것이 불가능하다.
    • 쓰레드를 사용하려면 항상 새롭게 쓰레드를 생성해야 하는데, 이는 비용이 많이 드는 작업이며 직접 쓰레드를 만드는 만큼 관리 역시 어렵다.
  • 위의 한계점을 해결하기 위해 Callable, Future, Executors 등이 등장하게 되었다.



Callable 인터페이스

  • 기존의 Runnable 인터페이스는 결과를 반환할 수 없다는 한계점이 있었다.
  • Runnable의 발전된 형태로써, Java5에 함께 추가된 제네릭을 사용해 결과를 받을 수 있는 Callable이 추가되었다.
  • Callable 인터페이스의 구현체인 Task는 가용 가능한 쓰레드가 없어서 실행이 미뤄질 수 있고, 작업 시간이 오래 걸릴 수도 있다.
    • 실행 결과를 바로 받지 못하고 미래의 어느 시점에 얻을 수 있다.
@FunctionalInterface
public interface Callable<V> {
    V call() throws Exception;
}



Future 인터페이스

  • 미래에 완료된 Callable의 반환값을 구하기 위해 사용된다.
  • Future 는 비동기 작업을 갖고 있어 미래에 실행 결과를 얻도록 도와준다.
    • 비동기 작업의 현재 상태를 확인하고, 기다리며, 결과를 얻는 방법 등을 제공한다.



Executor 인터페이스

  • 동시에 여러 요청을 처리해야 하는 경우에 매번 새로운 쓰레드를 만드는 것은 비효율적이기 때문에, 쓰레드를 미리 만들어두고 재사용하기 위한 쓰레드 풀(Thread Pool)이 등장하게 되었다.
  • Executor 인터페이스는 쓰레드 풀의 구현을 위한 인터페이스이다.
  • Executor 인터페이스는 인터페이스 분리 원칙(Interface Segregation Principle)에 맞게 등록된 작업을 실행하는 책임만 갖는다.
    • 전달받은 작업(Runnable)을 실행하는 메소드만 가지고 있다.
  public interface Executor {
       void execute(Runnable command);
}



ExecutorService 인터페이스

  • 작업(Runnable, Callable) 등록을 위한 인터페이스

  • ExecutorServiceExecutor 를 상속받아서 작업 등록 뿐만 아니라 실행을 위한 책임도 갖는다.

  • 쓰레드 풀은 기본적으로 ExecutorService 인터페이스를 구현한다.


비동기 작업을 위한 메소드들

ExecutorServiceRunnableCallbale을 작업으로 사용하기 위한 메소드를 제공한다. 동시에 여러 작업들을 실행시키는 메소드도 제공하고 있는데, 비동기 작업의 진행을 추적할 수 있도록 Future를 반환한다.

  • submit()
    • 지정된 작업을 실행하고 모든 작업이 완료되면, 작업의 상태와 결과를 포함하는 Future들을 반환한다.
    • 반환된 Future들은 모두 실행된 것이므로 반환된 isDonetrue이다.
    • 완료된 작업은 정상적으로 종료되거나 예외가 발생하여 종료될 수 있으므로 항상 성공한 것은 아니다.
  • invokeAll()
    • 모든 결과가 나올 때 까지 대기하는 블로킹 방식의 요청
    • 동시에 주어진 작업들을 모두 실행하고, 전부 끝나면 각각의 상태와 결과를 갖는 List<Future>를 반환한다.
  • invokeAny()
    • 가장 빨리 실행된 결과가 나올 때 까지 대기하는 블로킹 방식의 요청
    • 동시에 주어진 작업들을 모두 실행하고, 가장 빨리 완료된 하나의 결과를 Future로 반환받는다.



Executors 클래스

  • 고수준(High-Level)의 동시성 프로그래밍 모델
  • Executor, ExecutorService 또는 SchedueledExecutorService를 구현한 쓰레드 풀을 손쉽게 생성해준다.
  • newFixedThreadPool(int nThreads)
    • 고정된 쓰레드 개수를 갖는 쓰레드 풀을 생성한다.
    • ExecutorService 인터페이스를 구현한 ThreadPoolExecutor 객체가 생성된다.








출처
[Java] Executors Thread 사용법
[JAVA8 병렬프로그래밍] Executors 클래스, ExecutorService 인터페이스
[Java] Callable, Future 및 Executors, Executor, ExecutorService, ScheduledExecutorService에 대한 이해 및 사용법
ExecutorService를 이용해 multi thread 활용하기 (Java)

profile
💻 ⚾️ 🐻

0개의 댓글