Executors

Thread 와 Runnable 처럼 Low-Level API를 직접 다루는게 아니다. (Runnable을 여전히 사용하긴 하지만)

 

Executors

고수준 (High-Level) Concurrency 프로그래밍

  • Thread를 만들고 관리하는 작업을 애플리케이션에서 분리
  • 그런 기능을 Executors에게 위임

Executros가 하는일

  • Thread 만들기 : 애플리케이션이 사용할 Thread Pool을 만들어 관리한다.
  • Thread 관리 : Thread 생명 주기를 관리한다.
  • 작업 처리 및 실행 : Thread로 실행할 작업을 제공할 수 있는 API를 제공한다.

주요 인터페이스

  • Executor
    • execute(Runnable)
  • ExecutorService
    • Executor 상속 받은 인터페이스로 , Callable도 실행할 수 있으며 . Executor를 종료 시키거나 , 여러 Callable을 동시에 실행하는 등의 기능을 제공한다.

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        // 방법 1
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread : " + Thread.currentThread().getName());
            }
        });

        // 방법 2
        executorService.submit(() -> {
            System.out.println("Thread2 : " + Thread.currentThread().getName());
        });

        // ExecutorService는 실행 후 다음 작업을 대기 하고 있기 때문에 프로세스가 살아 있다.
        // 명시적으로 shutdown을 해야한다.
        // shutdown은 작업 완료가 보장된다.
        executorService.shutdown();
        executorService.shutdownNow();

//        출력
//        Thread : pool-1-thread-1
//        Thread2 : pool-1-thread-1

    }
    public static void main(String[] args) {
        // 2개의 Thread를 선언
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        // 2개의 Thread를 사용하여 5개의 작업을 한다.
        // Blocking-Queue와 Thread Pool이 존재한다.
        executorService.submit(getRunnable("Test1"));
        executorService.submit(getRunnable("Test2"));
        executorService.submit(getRunnable("Test3"));
        executorService.submit(getRunnable("Test4"));
        executorService.submit(getRunnable("Test5"));
        
//        출력
//        Test2 : pool-1-thread-2
//        Test1 : pool-1-thread-1
//        Test3 : pool-1-thread-1
//        Test4 : pool-1-thread-1
//        Test5 : pool-1-thread-1
    }

    private static Runnable getRunnable(String message) {
        return () -> {
            System.out.println(message + " : " + Thread.currentThread().getName());
        };
    }

 

  • ScheduledExecutorService
    • ExecutorService를 상속 받은 인터페이스로 특정 시간 이후에 또는 주기적으로 작업을 실행할 수 있다.
    public static void main(String[] args) {
        // 2개의 Thread를 선언
        ScheduledExecutorService scheduledExecutorService 
                = Executors.newSingleThreadScheduledExecutor();
        
        // 시작 1초 지연
        scheduledExecutorService
                .schedule(getRunnable("Thread1") , 1 , TimeUnit.SECONDS);

        // 시작 1초 지연 후 2초 간격으로 반복 실행
        scheduledExecutorService
                .scheduleAtFixedRate(getRunnable("Thread2") , 1 , 2, TimeUnit.SECONDS);

    }

    private static Runnable getRunnable(String message) {
        return () -> {
            System.out.println(message + " : " + Thread.currentThread().getName());
        };
    }

 

Fork/Join 프레임워크

ExecutorService의 구현체로 손쉽게 멀티 프로세서를 활용할 수 있게끔 도와준다.

 

 

 

 

 

Ctrl + Alt + M을 누르면 선택부분을 메소드화 할 수 있다.

 

 

참고Executors (The Java™ Tutorials > Essential Classes > Concurrency) (oracle.com)

 

 

더 자바, Java 8 - 인프런

자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이

www.inflearn.com

 

'기록 > JAVA' 카테고리의 다른 글

[JAVA8] CompletableFuture  (0) 2021.01.17
Callable과 Future  (0) 2021.01.16
Thread  (0) 2021.01.16
[JAVA8] Date 와 Time  (0) 2021.01.14
[JAVA8] Optional  (0) 2021.01.12