이번 챕터는 스레드를 대신할 수 있는 수단에 대해 설명하는데 설명자, 태스크가 정확히 와닿지 않아서 먼저 정리해본다.

  • 설명자는 ExecutorService는 병렬작업 시 여러개의 작업을 효율적으로 처리하기 위해 제공되는 java 라이브러리다.
  • 보통은 threadpool을 만들어서 쓰레드를 관리해줘야 하지만 설명자로 쉽게 처리가 가능하다.
  • 외부에서 쓰레드를 생성하는 메소드를 호출한다면 ExecutorService는 스스로 생명주기 관리를 해준다.

 

 


 

 

 

 

  • java.util.concurrent 라는 패키지는 실행자 프레임워크 (Executor Framework)라고 하는 인터페이스 기반의 유연한
  • 태스크 실행 기능을 담고 있다.
  • 작업 큐를 다음의 단 한줄로 생성이 가능하다.
// 실행자 생성
ExecutorService exec = Executors.newSingleThreadExecutor();

// task 넘기기
exec.execute(runnable);

// 실행자 종료
exec.shutdown();

 

 

실행자의 주요 기능

  • 특정 태스크가 완료되기를 기다린다.
  • 태스크 모음 중 아무것 하나 혹은 모든 태스크가 완료되기를 기다린다.
    • invokeAny , invokeAll
  • 실행자 서비스가 종료하기를 기다린다.
    • awaitTermination
  • 완료된 태스크들의 결과를 차례로 받는다.
    • ExecutorCompletionService
  • 태스크를 특정 시간에 혹은 주기적으로 실행하게 한다.
    • ScheduledThreadPoolExecutor
  • 큐를 둘 이상의 스레드가 처리하게 하고 싶다면 간단히 다른 정적 팩터리를 이용하여 달느 종류의 실행자 서비스(스레드 풀)를 생성하면 된다.
    • java.util.concurrent.Executors의 정적 팩터리를 이용해 스레드풀을 만들거나 ThreadPoolExecutor 클래스를 직접 사용할 수도 있다.
  • 작업 큐를 손수 만드는 일은 삼가해야 하며 스레드를 직접 다루는 것도 삼가야 한다.
  • 스레드를 직접 다루면 생명주기를 일일이 관리해줘야하기 때문에 작업량이 많아진다.

 

 

 


 

 

 

작업 단위를 나타내는 핵심 추상개념이 태스크다.

  • 태스크에는 두가지가 있다.
    • Runnable
    • Callable
      • Callable은 Runnable과 비슷하지만 값을 반환하고 임의의 예외를 던질 수 있음
  • 이런 태스크를 수행하는 일반적인 메커니즘이 바로 실행자 서비스이다.
  • 이런 태스크의 수행을 실행자 서비스에 맡기면 원하는 태스크 수행 정책을 선택할 수 있고 생각이 바뀌면 언제든 변경 가능하다.

+ Recent posts