문서의 이전 판입니다!
Java Concurrency in Practice
에 나오는 내용
N쓰레드 = N씨피유 * U씨피유 * (1 + W/C)
N씨피유
: Runtime.getRuntime().availableProcessors()
가 반환하는 Core 갯수U씨피유
: 0
~1
사이의 값을 갖는 CPU 활용 비율W/C
는 대기시간(I/O 시간 등)과 계산 시간(CPU가 직접 작동하는 시간)의 비율. I/O가 높으면 100, I/O는 낮고 CPU 활용시간이 많으면 0에 가깝게.executorService.shutdown(); try { if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) { executorService.shutdownNow(); } } catch (InterruptedException e) { executorService.shutdownNow(); }
ExecutorService executorService = Executors.newCachedThreadPool();
Executors.newSingleThreadScheduledExecutor()
사용시에는 스케줄이 여러개라도 하나의 스케줄러 쓰레드가 실행한다.scheduleAtFixedRate
는 태스크 시작시간 기준으로 delay를 적용한다. 앞선 스케줄이 여전히 실행중이면 기다렸다가 종료시점에 곧바로 시작한다.scheduleWithFixedDelay
는 태스크 종료시간 기준으로 delay를 적용한다. 앞선 스케줄이 여전히 실행중이면 기다렸다가 종료시점에 delay 시간만큼 기다리고 실행한다.ExecutorService
는 쓰레드 수를 조정할 수 있다. 서로 무관한 독립적인 태스크들을 각각의 쓰레드에서 실행할 때 사용.shtudown()
패턴을 참조한다.Future
의 get()
을 호출하지 말것.Future.get()
에 timeout을 적용하여 너무 오래 blocking 하지 않게 할 것.ExecutorService
를 생성하지 말라. 요청이 폭주할 때 요청보다 더 많은 쓰레드가 생성된다. 미리 생성해둔 것을 ExecutorService
를 재사용해야한다.corePoolSize
: 기본 Pool SizemaximumPoolSize
: 최대 Pool SizecorePoolSize
를 먼저 값을 설정하고 후에 maximumPoolSize
를 설정할 것. setMaxPoolSize
에서 corePoolSize
validation4ᅟᅳᆯ 수행함.