-
챕터[15] CompletableFuture와 리액티브 프로그래밍 컨셉의 기초모던자바인액션 2020. 10. 21. 16:05
서론
Future란?
Future(참조)
Thread Pool
Thread Pool을 이용하게 될 경우 계속해서 Thread가 증가하며 메모리가 할당되는 것이 아닌 별도의 Thread의 최대치를 정해둘 수 있다. 그렇기에 작업이 실행될 때마다 새로운 Thread가 생기는 것이 아닌 Thread Pool이 놀고 있는 Thread에게 작업을 할당해준다.
작업은 내부적으로 블로킹 큐에 저장되며, 놀고 있는 Thread가 블로킹 큐에서 작업을 빼서 실행하게 된다. 그리고 작업이 끝난 Thread 들은 다시 새로운 작업이 블로킹 큐에 들어올 때까지 대기상태로 대기한다.(유지한다)
장점
하드웨어에 맞는 수의 태스크를 유지함과 동시에 수 천개의 태스크를 Thread Pool에 아무 오버헤드 없이 제출할 수 있다는 점이다. 큐의 크기 조정, 거부 정책, 태스크 종류에 따른 우선순위 등 다양한 설정할 수 있다.
주의점
태스크가 종료되기 전까지 Thread에 작업이 할당되지 않기에 I/O를 기다리거나 잠을자거나 네트워크 연결을 기다리는 태스크가 존재하다면 결국 해당 태스크가 할당된 Thread는 엄청난 처리시간이 필요하기에 효율성이 떨어진다. 그리고 기존의 태스트가 나중의 태스크를 기다리는 상황(Futrue의 일반적인 패턴)이라면 데드락에 걸릴 수 도 있다.
중요한 코드를 실행하는 Thread가 죽는 일이 발생하지 않도록 보통 자바 프로그램은 main이 반환하기 전에 모든 Thread의 작업이 끝나길 기다린다. 따라서 프로그램 종료전 모든 Thread Pool을 종료하는 습관을 갖는 것이 중요하다.
Thread 문제
자바 Thread는 직접 운영체제 Thread에 접근하기에 비용이 비싸며, 운영체제가 지원하는 Thread 수를 초과해 사용할 경우 자바 애플리케이션이 예상치 못한 방식으로 충돌될 수 있다. 그렇기에 기존 Thread가 실행되는 상태에서 계속해서 새로운 Thread를 만드는 상황이 일어나지 않도록 주의해야 한다.
-> 당연한거겠지만 무한히 작업요청으로 Thread가 추가로 생기게 되면 그걸 연산을 당연히 못하는일이 언젠가 생길꺼라 생각했는데... 무튼 Thread 개수의 대해 알게됨... (운영체제에서 지원하는 수가 한계가 있는지...)
잠자기
Thread를 일정 속도마다 실행되게 sleep() 메서드를 사용할 경우 Thread는 잠이 들어도 여전히 시스템 자원을 점유한다. 그렇기에 N개 이상의 Thread가 전부 자기 시작하면 문제가 심각해진다.
-> 왠만하면 I/O, 네트워크, Sleep 하지말라면서...
발행자, 구독자
-> 그냥 발행자 구독하고 있는 친구가
'모던자바인액션' 카테고리의 다른 글
챕터[17] 리엑티브 프로그래밍 (0) 2020.10.22 챕터[16] 안정적 비동기 프로그래밍 (0) 2020.10.21 챕터[14] 자바 모듈 시스템 (0) 2020.10.21 챕터[13] 디폴트 메서드 (0) 2020.10.21 챕터[12] 새로운 날짜와 시간 API (0) 2020.10.21