ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Concurrent - Executor
    JAVA/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
Designed by Tistory.