스레드풀이란
스레드풀이란
스레드를 미리 만들어 풀장에 풀어놓는 개념이라고 이해하면 쉬움
사용자로부터 들어온 요청을 작업큐에 넣고 스레드풀은 작업큐에 들어온 Task 일감을 미리 생성해놓은 스레드들에게 일감을 할당한다.
일을 다 처리한 스레드를 다시 어플리케이션에게 결과값을 리턴한다.
자바에서는 스레드풀을 생성하고 사용할 수 있도록 concurrent 패키지에서 ExecutorService인터페이스와 Executors 클래스를 제공하고 있다. Executors의 다양한 정적 메소드를 통해 ExecutorService 구현 객체를 만들어서 사용할 수 있으며, 이것이 바로 스레드 풀이다.
스레드풀의 목적
성능 저하를 방지하기 위해서
매번 발생되는 작업을 병렬처리 하기 위해 스레드를 생성/수거 하는 부담은 전체적인 퍼포먼스를 저하시킨다
다수의 사용자 요청을 처리하기 위해
서비스적인 측면으로 바라볼 때 특히 대규모에서 중요함 . 다수의 요청을 수용하고, 빠르게 처리하고 대응하기 위해 스레드풀을 사용함
스레드 풀의 장점
스레들르 생성/수거하는데 드는 비용이 안듦
스레드가 생성될 때 OS가 메모리 공간을 확보해주고 메모리를 스레드에게 할당해준다.
스레드 풀을 미리 만들어 두기 때문에, 처음 생성하는 비용은 들지만 스레드를 재사용할 수 있으므로 시스템 자원을 줄일 수 있고, 작업 요청시 이미 스레드가 대기중인 상태라서 딜레이가 발생하지 않는다.
스레드 풀의 단점
너무 많은 스레드를 만들어놓으면 스레드들은 아ㅜㅁ일도 하지 않고 메모리만 차지하는 상황이 발생 할 수 있음
잉여 스레드가 발생할 수 있음
그래서 자바에서는 forkJoinPool을 지원함.
스레드 풀의 생성/종료
스레드 풀에 속한 스레드는 기본적으로 데몬 스레드 (주 스레드를 서포트 하기 위한 스레드, 주 스레드 종료시 강제 종료) 가 아니기 때문에
main스레드가 종료되어도 작업을 처리하기 위해 계속 실행상태로 남아있다. 즉 main() 메소드가 실행이 끝나도 어플리케이션 프로세스는 종료되지 않는다.
어플리케이션 프로세스를 종료하기 위해서 스레드 풀을 강제로 종료시켜 스레드를 해제시켜줘야 한다.
ExecutorService 구현객체에서는 기본적으로 3개 종료 메소드를 제공한다.