Executors

구름코딩·2020년 10월 10일
0

java8 _ 더 자바

목록 보기
15/23

High-Level Concurrency Programming

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

Executors의 역활

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

주요 인터페이스

Executors

  • execute(Runnable) <- 딱 하나의 메소드만 존재

ExecutorService

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

싱글쓰레드 사용하기

System.out.println("ExecutorService 사용방법\n");
//싱글스레드 사용
ExecutorService executorService = Executors.newSingleThreadExecutor();
//사용방법 1 : execute(new Runnable()) 고전적인 방법
executorService.execute(new Runnable() {
    @Override
    public void run() {
        System.out.println("1. Thread "+Thread.currentThread().getName());
    }
});

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

/*
executorService는 작업을 실행하고나면 다음 작업이 들어올때까지 계속해서 대기하므로 프로세스가 종료되지 않는다
-> 따라서 명시적으로 프로세스를 종료해줘야 한다
shutdown() _ gracefull하다 즉, 하고있는 일을 마무리하고 종료
shutdownNow() _ noMercy하다, 일의 마무리를 보장하지 않고 그냥 종료
 */
 
executorService.shutdown();

원하는 쓰레드 풀 개수로 제한하기

System.out.println("\n고정쓰레드로 개수 제한하기\n");
//2개의 쓰레드를 고정쓰레드 개수로 사용하겠다
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(getRunnable("Hello"));
executorService.submit(getRunnable("woonsik"));
executorService.submit(getRunnable("the"));
executorService.submit(getRunnable("java"));
executorService.submit(getRunnable("Thread"));

executorService.shutdown();

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

/*
어떻게 2개의 쓰레드로 5개의 작업을 수행?

메인에서 executor service에 5개의 작업을 보낸다
-> Thread pool에는 2개의 쓰레드만 존재 && Blocking Queue가 존재
-> 쓰레드가 바쁘면 나머지는 blocking queue에서 기다리고있다가 수행이 된다
 */

ScheduleExecutorService

  • ExecutorService를 상속받은 인터페이스로 특정 시간 이후에 또는 주기적으로 작업을 실행할 수 있다
System.out.println("싱글쓰레드 쓰케쥴executors");
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

//3초 대기 후 출력 (Runnable command, long delay, TimeUnit unit) <- 매개변수
executorService.schedule(getRunnable("Hello"), 3, TimeUnit.SECONDS);
executorService.shutdown();

//특정 시간마다 반복 - 1초기다렸다가 2초마다 반복 (command, initial delay, period, TimeUnit unit)
executorService.scheduleAtFixedRate(getRunnable("hello"), 1, 2, TimeUnit.SECONDS);

참고

oracle

profile
내꿈은 숲속의잠자는공주

0개의 댓글