[JAVA8] Executors

이재훈·2023년 5월 13일
0

JAVA8

목록 보기
12/23

인프런 강의 "더 자바, JAVA8"(백기선님)의 강의를 듣고 정리한 글 입니다.
JAVA8에 추가된 핵심 기능들을 이해하기 쉽게 설명해 주시니 한번씩 들어보시는 것을 추천드립니다.

"더 자바, JAVA8 바로가기"


Executors

고수준 Concurrency 프로그래밍

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

Executors가 하는 일

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

주요 인터페이스

  • Executor: excute(Runnalbe)
  • ExecutorService: Executor 상속 받은 인터페이스로, Callable도 실행할 수 있으며, Executor를 종료시키거나, 여러 Callable을 동시에 실행하는 동의 기능을 제공한다.
  • ScheduledExecutorService : ExecutorService를 상속 받은 인터페이스로 특정 시간 이후에 또는 주기적으로 작업을 추리할 수 있다.

ExecutorService로 작업 실행하기

public class App {
	public static void main(String[] args) throws Exception{
		ExecutorService executorService = Executors.newSingleThreadExecutor();
		executorService.submit(() -> 
		System.out.println("Thread : " + Thread.currentThread().getName())); 
		executorService.shutdown(); // 셧다운을 해주지 않으면 종료가 되지 않는다.
    }
}

현재는 싱글스레드로 만들었지만 여러개의 스레드를 만들 수도 있다.

public class App {
	public static void main(String[] args) throws Exception{
		ExecutorService executorService = Executors.newFixedThreadPool(2); // 쓰레드 2개
		executorService.submit(getRunnable("hi"));
		executorService.submit(getRunnable("hi"));
		executorService.submit(getRunnable("hi"));
		executorService.submit(getRunnable("hi"));
		executorService.submit(getRunnable("hi"));
		
		executorService.shutdown();
	}

	private static Runnable getRunnable(String msg) {

		return () -> System.out.println("msg " + msg  + ":" + Thread.currentThread().getName());
	}
}
실행 결과
msg hi:pool-1-thread-1
msg hi:pool-1-thread-2
msg hi:pool-1-thread-1
msg hi:pool-1-thread-2
msg hi:pool-1-thread-1

이렇게 쓰레드 두개를 사용을 해서 작업을 하는 것을 확인할 수 있습니다.

newSingleThreadScheduledExecutor 사용

public class App {
	public static void main(String[] args) throws Exception{
		ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
		service.schedule(getRunnable("hi"), 3, TimeUnit.SECONDS); // 3초 후 실행하라
		service.shutdown();
	}

	private static Runnable getRunnable(String msg) {

		return () -> System.out.println("msg " + msg  + ":" + Thread.currentThread().getName());
	}
}

ExecutorService로 멈추기

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

Fork/Join 프레임워크

  • ExecuterService의 구현체로 손쉽게 멀티 프로세서를 활용할 수 있게끔 도와준다.
profile
부족함을 인정하고 노력하자

0개의 댓글