자바 1.5 배포판 이후에 java.util.concurrent 패키지가 추가되었다.
여기에는 실행자 프레임워크(Executor Framework) 가 포함되어 있다.
이 녀석을 사용하면 Work queue 를 쉽게 관리할 수 있다.
ExecutorService executor = Executor.newSingleThreadExecutor();
executor.execute(runnable);
executor.shutdown(); // 추가된 task 들의 실행은 보장한다. shutdownNow() 도 있다.
ExecutorService는 다음과 같은 일을 할 수 있다.
· 특정 태스크가 종료되기를 기다림
· 임의의 태스크들이 종료되기를 기다림(invokeAny, invokeAll)
· 실행자 서비스가 자연스럽게 종료되길 기다림(awaitTermination)
· 태스크가 끝날 때 마다 그 결과를 차례로 가져옴(executorCompletionService)
큐의 작업을 처리하는 스레드
· 실행자 서비스(스레드 풀)를 생성하는 정적 팰터리 메서드를 이용
· Executors.newCachedThreadPool : 작은 프로그램이거나 부하가 크지 않은 서버
· Executors.newFixedThreadPool : 부하가 심한 서버
· ThreadpoolExecutor Class : 스레드 풀의 거의 모든 동작을 세밀하게 제어 가능
작업의 단위 : 태스크
· Runnable
· Callable
· 작업을 실행하는 일반적인 메커니즘 : executor service
태스크를 실행하는 일반 매커니즘 : 실행자 서비스(executor service)
실행자 프레임워크에는 ScheduledThreadpoolExecutor가 정의 되어 있다.
· Timer 가 사용하기는 더 쉬운 반면, 유연성은 ScheduledThreadPoolExecutor 가 훨씬 좋다.
· Timer 는 작업 실행을 위해 하나의 스레드만 사용하므로 오래 동안 실행하는 작업이 있을 경우 시간 측정의 정확도가 떨어질 수 있다. 또한 catch 안 된 예외를 던지면 Timer 가 중단된다.
· ScheduledThreadPoolExecutor 는 다중 스레드를 지원하고, unchecked 예외를 던지는 작업을 복구한다.
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 66 변경 가능 공유 데이터에 대한 접근은 동기화 하라 (0) | 2023.04.26 |
---|---|
<Effective Java> RULE 67 과도한 동기는 피하라 (0) | 2023.04.26 |
<Effective Java> RULE 69 wait이나 notify대신 병행성 유틸리티를 이용하라 (0) | 2023.04.26 |
<Effective Java> RULE 70 스레드 안전성에 대해 문서로 남겨라 (0) | 2023.04.26 |
<Effective Java> RULE 71 초기화 지연은 신중하게 하라 (0) | 2023.04.25 |