HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📝
남득윤 학습 저장소
/
🧵
멀티쓰레드, 동시성 프로그래밍
/
🧵
Java Concurrency and Multithreding
/
Java ExecutorService - Part 1

Java ExecutorService - Part 1

Java ExecutorService introduction

notion image

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

notion image

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(); } }