병렬 프로그래밍
- 자바는 멀티 스레딩 기법, 병렬 프로그래밍 기법을 지원
- 먼저 다음과 같은 용어를 정확히 이해할 필요가 있음
- 병행(Concurrency) - 하나의 물리적인 서버에서 동작, 하나의 CPU 코어에서 소프트웨어적인 기법으로 동시에 여러 작업을 교차하면서 실행
- 병렬(Parallel) - 하나의 물리적인 서버에서 동작, 여러개의 코어에 작업을 배분해서 실행
- 분산(Distribute) - 여러대의 원격 서버 혹은 물리적인 장비에 작업을 분산해 처리
- 병행은 프로그램적인 성질, 병렬은 기계적인 특징을 가짐
- 멀티코어 환경에서는 병행, 병렬이 동시에 일어남
컨커런트 API
Executors 클래스
포크/조인 프레임워크
Future와 CompletableFuture
스트림 병렬 처리
- 스트림은 손쉽게 병렬처리를 할 수 있음
- paralleStream 메서드를 이용해 스트림객체를 생성하는 것만으로도 병렬 처리 가능
- 기존 코드를 크게 고치지 않더라도 순차처리되던 스트림을 벙렬 처리되도록 수정 가능
List<Integer> intList = Arrays.asList(4, 2, 8, 1, 9, 6, 7, 3, 5);
// 최대값 구하기 - 병렬
int max = intList.paralleStream().reduce(1, Integer::max);
System.out.println("최댓값 : %s\n", max);
// 최솟값 구하기 - 병렬
int max = intList.paralleStream().reduce(1, Integer::min);
System.out.println("최솟값 : %s\n", min);
Thread.currentThread().getName();
System.setProperty("java.util.concurrent.ForJoinPool.comon.parallelism", "2");
- 경우에 따라 순차처리를 수행하다가 병렬처리가 필요하거나 병렬처리를 수행하다가 순차처리 수행이 필요함
- 다음과 같은 메서드로 순차/병렬을 변경가능
- parallel : 순차 -> 병렬
- sequential : 병렬 -> 순차
list.stream().limit(100).parallel().reduce(Integer::sum);