thread 가 생성될 때 os 는 요청을 받고 메모리 공간을 확보, 메모리를 스레드에게 할당하여 준다.
But 생성 / 수거에 드는 비용 무시못함
사용자에게 들어온 요청을 작업큐에 넣고 스레드풀은 task 일감을 미리 생성한 thread들에게 일감 할당
일을 처리한 thread 들은 어플리케이션에게 결과값 리턴
자바에서는 스레드풀을 생성하고 사용할 수 있도록 java.util.concurrent Package에서 ExecutorService 인터페이스와 Executors 클래스를 제공하고 있다. Executors의 다양한 정적 메서드를 통해 ExecutorService 구현객체를 만들어서 사용할 수 있으며, 그것이 바로 스레드 풀이다.
Thread Pool(스레드 풀) 을 왜 사용해야해???
이미 답은 나왔지만, 크게 2가지만 기억하면 된다.
1. 프로그램 성능저하를 방지하기 위해
매번 발생되는 작업을 병렬처리하기 위해 스레드를 생성/수거하는데 따른 부담은 프로그램 전체적인 퍼포먼스 저하시킨다.
따라서 스레드풀을 만들어 놓는다.
2. 다수의 사용자 요청을 처리하기 위해
서비스적인 측면으로 바라볼 때
특히 대규모 프로젝트에서 중요하다. 다수의 사용자의 요청을 수용하고, 빠르게 처리하고 대응하기 위해 스레드풀을 사용한다.
Thread Pool(스레드 풀)의 단점???
1. 과유불급...너무 많이 만들어 놓았다가 메모리 낭비만 발생.
많은 병렬처리를 예상해서 1억개의 스레드를 만들어 놓았다고 생각해보자. 실제로 100개정도의 요청과 병렬처리를 했다. 그렇다면.. 나머지 스레드들은 아무일도 하지않고 메모리만 차지하는 최악의 경우가 발생될 수 있다.
2. 노는 스레드가 발생될 수 있다.
1번과 비슷하지만 조금 다르다.
예를 들어 A,B,C 스레드 3개가 있는데, 병렬적으로 일을 처리하는 과정에서 A,B,C 작업완료 소요시간이 다른 경우 스레드 유휴시간 즉
A스레드는 아직 일이 많아서 허덕이고 있는데, B,C는 일을 다하고 A가 열심히 일하는 것을 보고 놀고만 있는 유휴시간이 발생된다.
자바에서는 이를 방지하기 위해 forkJoinPool 을 지원한다. 아래 링크를 통해 알아보자