Java ExecutorService introduction

Java ExecutorService example
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService es = Executors.newFixedThreadPool(10); es.execute(newRunnable("Task 1")); es.execute(newRunnable("Task 2")); es.execute(newRunnable("Task 3")); es.shutdown(); } private static Runnable newRunnable(String message) { return () -> System.out.println(Thread.currentThread().getName() + " : " + message); } }
pool-1-thread-3 : Task 3 pool-1-thread-2 : Task 2 pool-1-thread-1 : Task 1 Process finished with exit code 0
Java ExecutorService implementations
ExecutorService
는 인터페이스임- ThreadPoolExecutor
int corePoolSize = 5; int maxPoolSize = 10; long keepAliveTime = 5000; ExecutorService threadPoolExecutor = new ThreadPoolExecutor( corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>() );
ExecutorService es= Executors.newFiexedThreadPool(3);
- ScheduledExecutorService
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); ScheduledFuture scheduledFuture = scheduledExecutorService.schedule(new Callable() { public Object call() throws Exception { System.out.println("Executed!"); return "Called!"; } }, 5, TimeUnit.SECONDS);
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
Java ThreadPoolExecutor constructor explained
- corePoolSize - 시작 쓰레드 사이즈
- maxPoolSize - 최대 쓰레드 사이즈
- keepAliveTime - 쓰레드가 일을 안하고 있을때 살아있는 시간 (지나면 종료됨)
- TimeUnit
- 작업 큐
Executors
의 팩터리 메서드를 활용하는것이 좋다.Java ExecutorService methods Java ExecutorService submit(Runnable) method
void execute(Runnable runnable)
Future<?> submit(Runnable runnable)
void shutdown( )
public class ExecutorsServiceExample3 { public static void main(String[] args) { ExecutorService es = Executors.newSingleThreadExecutor(); Future<?> future = es.submit(newRunnable("Task 1")); System.out.println(future.isDone()); try { future.get(); } catch (ExecutionException e) { } catch (InterruptedException e) { } System.out.println(future.isDone()); es.shutdown(); } }
false pool-1-thread-1 : Task 1 true Process finished with exit code 130
Future future
- 작업 상태 정보 저장 객체 future.isDone( )
- 작업 끝낱는지 확인future.get( )
- 값은 무적권 null 이다. 근데 실행 될 때까지 쓰레드를 block하는 효과로 사용 가능, 동기적으로 작업 실행을 강요할 수 있다.Java ExecutorService submit(Callable) method
public class ExecutorsServiceExample4 { public static void main(String[] args) { ExecutorService es = Executors.newSingleThreadExecutor(); Future<String> future = es.submit(newCallable("Task 1")); System.out.println(future.isDone()); try { String message = future.get(); System.out.println("message = " + message); } catch (ExecutionException | InterruptedException e) { } System.out.println(future.isDone()); es.shutdown(); } private static Callable<String> newCallable(String message){ return () -> Thread.currentThread().getName() + " : " + message; } }
false message = pool-1-thread-1 : Task 1 true Process finished with exit code 0
How a Future object is connected to a task

Java ExecutorService invokeAny() method
public class ExecutorsServiceExample5 { public static void main(String[] args) { ExecutorService es = Executors.newSingleThreadExecutor(); List<Callable<String>> callables = new ArrayList<>(); callables.add(newCallable("Task 1.1")); callables.add(newCallable("Task 1.1")); callables.add(newCallable("Task 1.1")); try { System.out.println(es.invokeAny(callables)); } catch (ExecutionException | InterruptedException e) { } es.shutdown(); } }
Callable 콜렉션 중 아무거나 호출하고 결과를 바로 반환
Java ExecutorService invokeAll() method
public class ExecutorsServiceExample5 { public static void main(String[] args) { ExecutorService es = Executors.newSingleThreadExecutor(); List<Callable<String>> callables = new ArrayList<>(); callables.add(newCallable("Task 1.1")); callables.add(newCallable("Task 1.2")); callables.add(newCallable("Task 1.3")); try { List<Future<String>> futures = es.invokeAll(callables); for (Future<String> future : futures) { System.out.println(future.get()); } } catch (ExecutionException | InterruptedException e) { } es.shutdown(); } }