
( https://adjh54.tistory.com/544 )
이러한 비동기 작업은 별도의 스레드에서 실행이 되며, 메인 스레드가 블로킹되지 않도록 합니다.
즉, 메인 스레드가 특정 작업을 기다리느라 멈추지 않고, 다른 작업을 계속해서 수행할 수 있습니다.
// ComputableFuture를 통해서 비동기 요청으로 처리할 수 있다.
// 또한 아래 출력값은 별도의 스레드임을 알 수 있다.
// ForkJoinPool의 commonPool()을 사용해 작업을 실행할 쓰레드를 쓰레드 풀로부터 얻어 실행시킨다.
// 만약 원하는 쓰레드 풀을 사용하려면, ExecutorService를 파라미터로 넘겨주면 된다.
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
System.out.println("Thread: " + Thread.currentThread().getName());
});
future.get();
System.out.println("Thread: " + Thread.currentThread().getName());
작업을 작은 서브 task로 분할 한 후, 분할된 작업은 ForkJoinPool의 스레드 데큐에 추가가 된다.
각 스레드는 자신의 deque에서 작업을 가져와 처리한다.
자바에선 Stream의 ParrallelStream이 ForkJoin을 사용한다.
ForkJoinPool.commonPool()은 JVM 당 1개만 존재하며, 전반의 병렬 스트림 연산에 사용.
( 스트림의 원소들은 작은 테스크로 분할되어 ForkJoinTask로 감싸진 후, ForkJoinPool에 제출되어 처리.)
개수는 물리적 CPU 코어 수, 또는 논리적 프로세스 수(하이퍼스레딩이 활성화된 경우)
공용 풀에 다른 작업을 위해 최소한 하나의 스레드를 남견다.
Excutor : 쓰레드를 미리 만들어두고 재사용하기 위한 쓰레드 풀의 인터페이스
( 등록된 작업을 실행하는 책임 = 전달받는 작업(Runnable)만 실행)
ExcutorService : 작업 등록을 위한 인터페이스
Excutor를 상속받아서 작업 등록 뿐만 아니라 실행을 위한 책임도 있다.
( ThreadPool의 기본은 ExcutorService를 구현)
ScheduledExecutorService : 특정 시간 이후에 또는 주기적으로 작업을 실행시키는 메소드, 스케줄링
Executors : 위를 만들어주는 팩토리 클래스.
