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의 구현체로 손쉽게 멀티 프로세서를 활용할 수 있게끔 도와준다.
Executors
Thread 와 Runnable 처럼 Low-Level API를 직접 다루는게 아니다. (Runnable을 여전히 사용하긴 하지만)
Executors
고수준 (High-Level) Concurrency 프로그래밍
Executros가 하는일
주요 인터페이스
Fork/Join 프레임워크
ExecutorService의 구현체로 손쉽게 멀티 프로세서를 활용할 수 있게끔 도와준다.
참고Executors (The Java™ Tutorials > Essential Classes > Concurrency) (oracle.com)
더 자바, Java 8 - 인프런
자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이
www.inflearn.com
'기록 > JAVA' 카테고리의 다른 글