[Java 8] Executors

홍정완·2022년 6월 19일
0

Java

목록 보기
11/25
post-thumbnail

High-Level Concurrency 프로그래밍


  • 쓰레드를 만들고 관리하는 작업을 애플리케이션에서 분리

    • 그런 기능을 Executors에게 위임



Executors


  • 쓰레드 만들기

    • 애플리케이션이 사용할 쓰레드 풀을 만들어 관리

  • 쓰레드 관리

    • 쓰레드 생명 주기 관리

  • 작업 처리 및 실행

    • 쓰레드로 실행할 작업을 제공할 수 있는 API 제공



주요 인터페이스


  • Executor

    • execute(Runnable)

  • ExecutorService

    • Executor를 상속받은 인터페이스
    • Callable 실행, Executor 종료, 여러 Callable 동시 실행 등의 기능 제공

  • ScheduledExecutorService

    • ExecutorService를 상속받은 인터페이스
    • 특정 시간 이후에 또는 주기적으로 작업을 실행할 수 있다.



ExecutorService로 작업 실행


public static void main(String[] args) {

        ExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

        executorService.submit(() -> {
            System.out.println("Thread " + Thread.currentThread().getName()); 
        }); // Thread pool-1-thread-1

        executorService.shutdown();    // 처리중인 작업 기다렸다가 종료
        executorService.shutdownNow(); // 당장 종료

    }



ScheduledExecutorService로 작업 실행


public static void main(String[] args) {

        ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        // 2초 딜레이후 반복 실행
        scheduledExecutorService.schedule(getRunable("Hello"), 2, TimeUnit.SECONDS);

        // delay(일정 시간)이 지난 후에 period(시간 간격)으로 task(작업)을 수행
        scheduledExecutorService.scheduleAtFixedRate(getRunable("Repeat"), 1, 2, TimeUnit.SECONDS);

    }

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



다중 Thread

public static void main(String[] args) {
        // 쓰레드 2개 생성
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        executorService.submit(getRunable("Hello"));
        executorService.submit(getRunable("Jungwan"));
        executorService.submit(getRunable("The"));
        executorService.submit(getRunable("Java"));
        executorService.submit(getRunable("Thread"));

        executorService.shutdown();
    }

    //    Hello pool-1-thread-1
    //    Jungwan pool-1-thread-2
    //    The pool-1-thread-1
    //    Java pool-1-thread-2
    //    Thread pool-1-thread-1

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

  • Thread Poll 2개를 사용하여 많은 작업을 할 경우, Blocking Queue에 담아 차례로 실행한다.

profile
습관이 전부다.

0개의 댓글