ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Executors
    백기선(인프런 강의)/더 자바, Java 8 2020. 7. 16. 13:08
    반응형

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

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

     

    Executors가 하는 일

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

     

    주요 인터페이스

    Executor

    • execute(Runnable)

    ExecutorService

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

    ScheduledExecutorService

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

     

    예제

    public class App {
    
    	public static void main(String[] args) {
    		ExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    		
    		executorService.submit(() -> {
    			System.out.println("Thread " + Thread.currentThread().getName());
    		});
    		
    		executorService.shutdown();
    		executorService.shutdownNow(); // 당장 종료
    	}
    }

     

    public class App {
    
    	public static void main(String[] args) {
    		ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
    		// 3초 딜레이후 실행
    		scheduledExecutorService.schedule(getRunable("Hello"), 3, TimeUnit.SECONDS);
    		// 반복 실행
    		// 아래 shutdown 지우고 실행
    		scheduledExecutorService.scheduleAtFixedRate(getRunable("Repeat"), 1, 2, TimeUnit.SECONDS);
    
    		scheduledExecutorService.shutdown();
    	}
    
    	private static Runnable getRunable(String message) {
    		return () -> System.out.println(message + " " + Thread.currentThread().getName());
    	}
    }

     

     

     

    다중 쓰레드

    public class App {
    
    	public static void main(String[] args) {
    		// 쓰레드를 2개 생성
    		ExecutorService executorService = Executors.newFixedThreadPool(2);
    		
    		executorService.submit(getRunable("Hello"));
    		executorService.submit(getRunable("JinSeok"));
    		executorService.submit(getRunable("The"));
    		executorService.submit(getRunable("Java"));
    		executorService.submit(getRunable("Thread"));
    		
    		executorService.shutdown();
    	}
    	private static Runnable getRunable(String message) {
    		return () -> System.out.println(message + Thread.currentThread().getName());
    	}
    }

     

    위의 코드를 그림으로 표현하면 아래와 같다.

    쓰레드를 Pool을 2개 사용하여 많은 작업을 할 경우 Blocking Queue에 담아 차례로 실행을 진행한다.

     

     

     

     

     

     

     

     

    참고

     

    반응형

    '백기선(인프런 강의) > 더 자바, Java 8' 카테고리의 다른 글

    CompletableFuture  (0) 2020.07.22
    Callable과 Future  (0) 2020.07.20
    자바 Concurrent 프로그래밍 소개  (0) 2020.07.16
    Date와 Time API  (0) 2020.07.12
    Optional API  (0) 2020.07.12
Designed by Tistory.