일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- test
- springcloud
- unittest
- reactive
- netflix eureka
- 탐색
- 설계
- Java
- spring cloud netflix zuul
- unit
- dfs
- api-gateway
- BFS
- Dynamic Routing
- forkandjoinpool #threadpool #jvm #async #non-blocking
- 서비스스펙
- Spring Data Redis
- code refactoring
- zuul
- spring cloud netflix
- netflix
- spring cloud netflix eureka
- 단위테스트
- java #jvm #reference #gc #strong reference
- Eureka
- container image #docker #layer #filesystem #content addressable
- docker
- microservice architecture
- spring cloud
- Today
- Total
phantasmicmeans 기술 블로그
ForkJoinPool 본문
CompletableFuture를 활용해 작업을 하다 우연히 스레드명을 로깅하게 되었고 이는 default로 ForkAndJoinPool()을 사용하는 것을 알았다.
ForkAndJoinPool()은 Java 7에서 도입되었으며 보통의 ExecutorService와 비슷하나 차이점을 가진다.
사실 이름만 봐도 어느정도 감이 올것이다.
ForKAndJoinPool은 2가지 recursive한 스텝을 가진다.
1. Fork
첫 번째 작업은 "split itself" 이다. 자신을 더 작은 subTask로 나눈다. 이후 subTask는 parallel or concurrent하게 실행된다.
위 그럼처럼 Task를 SubTask로 fork하여 분리한다.
subTask는 parallel하게 실행되거나, cpu core 상황에 의해 concurrent하게 실행된다.
Task를 subTask로 분리하는 것으로 보아 당연히 스레드 생성 비용이 들 것이다. 그렇기에 작은 작업은 ExecutorService를 이용하든, ThreadPoolExecutor를 이용해 스레드 풀을 생성해서 사용하는 편이 좋다.
2. Join
Task 자체가 자신을 subTask로 분리하게 되면, Task는 subTask가 종료할 때 까지 wait한다.
이후 subTask가 종료되면 Task는 그들의 결과를 join하는 형태이다.
CompletableFuture는 비동기적 프로그래밍을 위한 비동기 인터페이스이다. Task를 non-blocking으로 분리된 스레드에서 처리하고, 메인 스레드에게 task의 작업 결과 혹은 실행 결과를 전달한다.
'Programming > Java' 카테고리의 다른 글
JVM Strong Reference란 무엇인가 (0) | 2019.10.26 |
---|