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)
에서 반환된Future
는future.get()
이null
이면 task가 정상적으로 완료된 것이다.subimt(Callable)
에서 반환된Future
은 task가 완료되면call()
에서 리턴한 객체를future.get()
에서 받을 수 있다.ExecutorService
는Callable
을 대량으로 처리하기 위해invokeAny
/invokeAll
을 제공하는데invokeAny
/invokeAll
모두Callable
의Collection
을 처리한다.invokeAny
는Callable
들중 하나를 수행해서 그 결과를 리턴하고 나머지Callable
들은 취소한다.invokeAll
은 모든Callable
을 수행하고, 각각의Future
의 리스트를 반환한다.