기장 기본적인 방법
작업을 단일 스레드에서 순차적으로 실행하기.
서버-클라이언트 구조에서 요청 처리 과정은 I/O 작업이 큰 부분을 차지.
만약 서버 애플리케이션이 단일 스레드에서 동작하면, I/O 작업때문에 다른 요청을 전혀 처리하지 못하게 됨.
작업마다 스레드를 생성하는 방법
요청이 들어올 때 마다 새로운 스레드를 하나씩 만들어 실행시키면 응답 속도를 더 높일 수 있음.
이렇게하면 요청을 병렬로, 동시에 처리 가능.
동시에 스레드 안전성을 확보해야 함.
스레드 라이프 사이클 문제
스레드 생성, 제거 작업에도 자원이 소모된다고 함.. -> delay
idle 상태에 있는 스레드가 많아질수록 많은 메모리를 필요로 함.
JVM GC 부하가 늘어나고, CPU를 사용하기 위해 여러 스레드가 경쟁하는 상황이 되어서 많은 컨텍스트 스위칭 비용도 발생하게 됨.
OutOfMemoryError 발생 가능성
자원이 고갈되어 프로그램이 멈추는 경우가 발생하지 않는지 꼭 테스트해야 한다고 함!!
요청마다 스레드를 만들면, 요청 엄청 많아져서 자원 고갈시켜 OutOfMemoryError 발생 가능하다는 거임
작업(task)는 논리적인 업무? 단위, 스레드는 특정 작업을 비동기로 동작시킬 수 있는 방법.
java.util.concurrent 패키지의 Executor 인터페이스에 스레드풀들이 제공됨.
Executor를 제대로 종료시키지 않으면 JVM 종료가 안되기도 한다고 함..
종료 방식은 graceful / abrupt등 여러가지가 있다고 함.
ExecutorService의 상태는 running, shutting down, terminated 3가지 상태가 있다고 함
실행 거절 핸들러(rejected execution handler)
이미 종료 절차가 시작되거나 종료된 이후에 새로운 작업을 등록하려 하면 실행 거절 핸들러를 통해 오류로 처리한다고 함.
I/O bound task
ex) 이미지 다운로드, DB 쿼리 등 네트워크 타는거..
Callable, Future 사용 가능하다고 함..
thread life cycle?
single thread executor는 작업을 처리하는 스레드가 1개뿐이라는데..
안좋은거 아님? 이게 효율적임?
newCachedThreadPool은 왜 이름에 캐시가 들어가있는거?
Timer 클래스 vs ScheduleThreadPoolExecutor 클래스
Callable 인터페이스..?