[Java] ExecutorService

Executor

제출된 Runnable task를 실행하는 객체.

ExecutorService

하나 이상의 비동기 task의 진행상태를 추적하기위한 Future를 생성하는 메소드 를 제공하는 Executor.

ExecutorService 예제[1]

간단한 ExectorService 사용법.

ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(new Runnable() {
  public void run() {
    System.out.println("Asynchronous task");
  }
});
executorService.shutdown();

Executors.newFixedThreadPool() 라는 팩토리 메소드를 통해 10개의 스레드 풀을 사용하는 executorService를 만들고 "Asynchronous task"라는 내용을 출력한 뒤 종료.

ExecutorService를 모두 사용한 뒤에는 자원 반납을 위해 반드시 종료해야하며 종료를 위해 두 개의 메소드shutdown(), shutdownNow() 가 제공된다.

shutdown()은 기존에 등록된 task들을 모두 수행한 후 종료되지만, shutdownNow()실행 중인 task를 멈추고 대기 중인 task를 반환한다.

ExecutorService 생성하기

ExecutorService는 인터페이스로 ScheduledExecutorService, ScheduledThreadPoolExecutor, ThreadPoolExecutor로 구현되어 있음. 3개의 클래스중 선택해서 사용해도 되고 위의 예제 처럼 java.util.concurrent.Executors 클래스의 팩토리 메소드들을 사용해도 된다.

ExecutorService 사용하기

ExecutorService에서는 submit()메소드를 통해 Runnable또는 Callable 객체를 전달 할 수 있다. 이때 submit메소드는 제출된 task의 진행상태를 추적하기위한 Future 객체를 반환함.

Future future1 = executorService.submit(new Runnable() {
  public void run() {
    System.out.println("Asynchronous task");
  }
});
if (future1.get() == null) {
  System.out.println("task has finished");
}
Future future2 = executorService.submit(new Callable() {
  public Object call() throws Exception {
    System.out.println("Asynchronous task");
    return "task result";
  }
});
  • subimt(Runnable)에서 반환된 Futurefuture.get()null이면 task가 정상적으로 완료된 것이다.
  • subimt(Callable)에서 반환된 Future은 task가 완료되면 call()에서 리턴한 객체를 future.get()에서 받을 수 있다.
  • ExecutorServiceCallable을 대량으로 처리하기 위해 invokeAny/invokeAll을 제공하는데 invokeAny/invokeAll 모두 CallableCollection을 처리한다.
  • invokeAnyCallable들중 하나를 수행해서 그 결과를 리턴하고 나머지 Callable들은 취소한다.
  • invokeAll은 모든 Callable을 수행하고, 각각의 Future의 리스트를 반환한다.
참고자료

  1. tutorials.jenkov.com ↩︎

Juyeong Lee

구직중입니다. https://www.linkedin.com/in/juyeong/