dsc-sookmyung / 2023-01-Effective-Java-Study

이펙티브 자바 공부하는 스터디입니다
2 stars 3 forks source link

Item80. 스레드보다는 실행자, 태스크, 스트림을 애용하라 #79

Open Mingadinga opened 1 year ago

Mingadinga commented 1 year ago

스레드를 직접 다루면 Thread가 작업 단위와 수행 매커니즘 역할을 모두 수행하게 된다. 그보다는 실행자 프레임워크를 사용해 작업 단위와 실행 매커니즘을 분리하고, 작업 수행을 위임하는 것이 좋다.

실행자 프레임워크

java.util.concurrent 패키지는 실행자 프레임워크 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있다.

주요 API

CachedThreadPool과 ThreadPoolExecutor

실행자 서비스를 사용하기 까다롭다면, 스레드 풀을 만들어 사용할 수 있다.

image

CachedThreadPool

ThreadPoolExecutor

실행자 프레임워크 사용의 장점

태스크 == 작업 단위

포크 조인 풀 fork-join pool과 스트림

자바 7부터 실행자 프레임워크는 포크 조인 태스크를 지원한다.

image

포크 조인 태스크는 포크 조인 풀이라는 특별한 실행자 서비스가 실행한다.

import java.math.BigInteger;
import java.util.stream.LongStream;

public class ParallelPrimeCounting {
    // Prime-counting stream pipeline - parallel version (Page 225)
    static long pi(long n) {
        return LongStream.rangeClosed(2, n)
                .parallel()
                .mapToObj(BigInteger::valueOf)
                .filter(i -> i.isProbablePrime(50))
                .count();
    }

    public static void main(String[] args) {
        System.out.println(pi(10_000_000));
    }
}