제목: (멀티 코어를 100% 활용하는) 자바 병렬 프로그래밍 / Java Concurrency in Practice

저자: 브라이어 게츠, 더그 리, 팀 피얼스, 조셉 보우비어, 데이빗 홈즈, 조슈아 블로쉬

출판사: 에이콘


하나의 스레드에 작업을 순차적으로 수행한다면?

==> 대부분의 작업은 I/O에 시간이 소요되므로, CPU는 놀게 된다.


작업마다 스레드를 직접 만들어 할당한다면? 

==> 스레드 생성/제거도 공짜가 아니다. 자원과 시간을 소모한다.

==> 생성할 수 있는 스레드 개수는 무한대가 아니다.


따라서 Executor 프레임웍을 사용하자!!


new Thread(runnable).start()

와 같은 코드가 보이면 Executor를 사용해서 유연한 실행 정책을 적용할 것을 고려해야 함.





ThreadPool을 이용할 때의 장점

- 매번 스레드를 새로 생성하지 않고 재활용한다. ==> 자원을 절약, 딜레이가 줄어들어 반응속도 향상. 

- 적절한 스레드 개수 조절로 CPU가 놀지 않도록 함


ThreadPool을 얻는 방법

- newFixedThreadPool

- newCachedThreadExecutor

- newSingleThreadExecutor

- newScheduledThreadPool




ExecutorService 인터페이스에는 동작주기를 관리할 수 있는 여러 메소드가 있다.

- void shutdown()

- List<Runnable> shutdownNow()

- boolean isShutdown()

- boolean isTerminated()

- boolean awaitTermination(long timeout, TimeUnit unit)




Timer 클래스 대신 ScheduledThreadPoolExecutor를 사용하자.

Timer의 단점: 

- 한개의 스레드만을 사용하기 때문에 주기적으로 실행되도록 했을 경우 만약 등록된 작업이 오래 걸린다면 작업이 완료된 후 밀려 있던 작업이 한꺼번에 수행되거나 정책에 따라 누락될 수도 있다.

- Exception 처리를 하지 않는다. Timer 스레드 자체가 멈춘 후 새로운 작업을 등록할 수도 없는 상태가 될 수 있다. 


DelayQueue 사용도 고려해 볼 것.




사용예: (브라우저에서) CompletionService를 이용한 웹페이지 렌더링



저작자 표시 비영리 변경 금지
신고