IT/Programming / / 2023. 4. 26. 13:24

<Effective Java> RULE 68 스레드보다는 실행자와 태스크를 이용하라

반응형

 

자바 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 예외를 던지는 작업을 복구한다.

 

 

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유