-
Concurrent - ExecutorJAVA/JAVA8 관련 2022. 5. 22. 01:13
앞서 다룬 Thread나 Runnable와 같이 Low-Level API를 직접 다루는 것이 아닌, 쓰레드를 만들고 관리하는 작업을 고수준 API인 Executors에 위임하는 것
고수준 (High-Level) Concurrency 프로그래밍
- 쓰레드를 만들고 관리하는 작업을 애플리케이션에서 분리.
- 그런 기능을 Executors에게 위임.
Executors가 하는 일
- 쓰레드 만들기: 애플리케이션이 사용할 쓰레드 풀을 만들어 관리한다.
- 쓰레드 관리: 쓰레드 생명 주기를 관리한다.
- 작업 처리 및 실행: 쓰레드로 실행할 작업을 제공할 수 있는 API를 제공한다.
단일 쓰레드 사용
public class Executor1 { public static void main(String[] args) { // 쓰레드를 하나만 사용하는 Executor ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.execute(() -> { System.out.println("new Thread : " + Thread.currentThread().getName()); }); // graceful shutdown (진행중인 작업을 마무리하고 Shut down) executorService.shutdown(); // hard shutdown (현재 진행 중인 작업을 무시하고 강제 종료하는 Shut down) executorService.shutdownNow(); } }
ExecutorService는 작업 수행 후에 다음 작업이 들어오기 전까지 대기하고 쓰레드가 죽지 않는다.그렇기 때문에 명시적으로 ExecutorService를 ShutDown해야 한다. ShutDown에는 두가지 종류가 존재한다.graceful shutdown : shutdown() 호출. 현재 진행중인 작업을 마무리하고 ExecutorService를 종료hard shutdown : shutdownNow() 호출. 현재 진행 중인 작업을 무시하고 ExecutorService 강제종료
멀티 쓰레드 사용
Executors.newFixedThreadPool(). 쓰레드를 여러개 사용하는 Executors
EX:) 2개의 쓰레드를 가지고 있는 ExecutorService에 5개의 작업을 보내면 두개의 쓰레드가 번갈아가며 작업을 수행함.
2개 초과의 작업이 들어올 시에는 Blocking Queue에 작업들을 쌓아놓고 잉여 쓰레드가 발생시 작업을 할당한다.
public class Executor2 { public static void main(String[] args) { // 쓰레드를 두 개 가지고 있는 ExecutorService ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.execute(getRunnable("HI")); executorService.execute(getRunnable("JUMP")); executorService.execute(getRunnable("THE")); executorService.execute(getRunnable("WORLD")); executorService.execute(getRunnable("!!!!!")); executorService.shutdown(); } private static Runnable getRunnable(String message) { return () -> System.out.println(message + " : " + Thread.currentThread().getName()); } }
스케줄 쓰레드
Executors.newSingleThreadScheduledExecutor(). 특정 시간 이후 또는 주기적인 작업을 처리할 떄 사용하는 Executors
5초 뒤에 작업 수행하는 예제
public class Executor3 { public static void main(String[] args) { ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); // 5초 뒤에 작업을 실행 scheduledExecutorService.schedule(getRunnable("HI!!!!"), 5, TimeUnit.SECONDS); } private static Runnable getRunnable(String message) { return () -> System.out.println(message + " : " + Thread.currentThread().getName()); } }
처음 딜레이 1초, 주기는 2초인 작업을 수행하는 예제
public class Executor4 { public static void main(String[] args) { ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); // 처음 딜레이는 1초, 주기는 2초마다 작업을 실행 scheduledExecutorService.scheduleAtFixedRate(getRunnable("hello!!!"), 1, 2, TimeUnit.SECONDS); } private static Runnable getRunnable(String message) { return () -> System.out.println(message + " : " + Thread.currentThread().getName()); } }
'JAVA > JAVA8 관련' 카테고리의 다른 글
CompletableFuture1 (0) 2022.05.31 Callable과 Future (0) 2022.05.28 Concurrent 프로그래밍 소개 (0) 2022.05.20 Date와 Time (0) 2022.05.15 Date 와 Time 소개 (0) 2022.05.15