제목: (멀티 코어를 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를 이용한 웹페이지 렌더링
'요점정리 > 자바 병렬 프로그래밍 Java Concurrency in Practice' 카테고리의 다른 글
05. 구성단위 (0) | 2014.09.05 |
---|---|
04. 객체 구성 (0) | 2014.09.03 |
03. 객체 공유 (0) | 2014.09.02 |
01. 개요 / 02. 스레드 안정성 (0) | 2014.08.31 |
(멀티 코어를 100% 활용하는) 자바 병렬 프로그래밍 / Java Concurrency in Practice (0) | 2014.08.30 |