멀티스레드와 동시성

Ch12. 스레드 풀과 Executor 프레임워크 - ExecutorService(작업 컬렉션 처리)

webmaster 2024. 10. 13. 12:59
728x90

ExecutorService는 작업을 번에 편리하게 처리하는 invokeAll() , invokeAny() 기능을 제공한다.

작업 컬렉션 처리

invokeAll()

  • <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
    • 모든 Callable 작업을 제출하고, 모든 작업이 완료될 때까지 기다린다.
  •  <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
    • 지정된 시간 내에 모든 Callable 작업을 제출하고 완료될 때까지 기다린다.

invokeAny()

  • <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
    • 하나의 Callable 작업이 완료될 때까지 기다리고, 가장 먼저 완료된 작업의 결과를 반환한다.
    • 완료되지 않은 나머지 작업은 취소한다.
  • <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
    • 지정된 시간 내에 하나의 Callable 작업이 완료될 때까지 기다리고, 가장 먼저 완료된 작업의 결과를 반환한다.
    • 완료되지 않은 나머지 작업은 취소한다.

invokeAll() , invokeAny()를 사용하면 한꺼번에 여러 작업을 요청할 수 있다. 둘의 차이를 코드로 알아보자.

 

특정 시간 대기하는 CallableTask

특정 시간 대기하는 CallableTask - 실행 코드

  • Callable 인터페이스를 구현한다.
  • 전달받은 sleep값만큼 대기한다.
  • sleep 값을 반환한다.

InvokeAll()

invokeAll - 실행 코드
실행 결과

  • invokeAll() 은 한 번에 여러 작업을 제출하고, 모든 작업이 완료될 때까지 기다린다.

InvokeAny()

invokeAny - 실행 코드
실행 결과

  • invokeAny()는 한 번에 여러 작업을 제출하고, 가장 먼저 완료된 작업의 결과를 반환한다.
  • 이때 완료되지 않은 나머지 작업은 인터럽트를 통해 취소한다.

 

728x90