사용자 도구

사이트 도구


java:concurrent:executorservice

문서의 이전 판입니다!


Java ExecutorService

Basic ExecutorService shutdown Pattern

executorService.shutdown();
try {
    if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) {
        executorService.shutdownNow();
    } 
} catch (InterruptedException e) {
    executorService.shutdownNow();
}
 

ScheduledExecutor

  • Executors.newSingleThreadScheduledExecutor() 사용시에는 스케줄이 여러개라도 하나의 스케줄러 쓰레드가 실행한다.
  • scheduleAtFixedRate 는 태스크 시작시간 기준으로 delay를 적용한다. 앞선 스케줄이 여전히 실행중이면 기다렸다가 종료시점에 곧바로 시작한다.
  • scheduleWithFixedDelay 는 태스크 종료시간 기준으로 delay를 적용한다. 앞선 스케줄이 여전히 실행중이면 기다렸다가 종료시점에 delay 시간만큼 기다리고 실행한다.

ExecutorService vs. Fork/Join

  • Java 7 에 Fork/Join 추가
  • ExecutorService는 쓰레드 수를 조정할 수 있다. 서로 무관한 독립적인 태스크들을 각각의 쓰레드에서 실행할 때 사용.
  • Fork/Join은 하나의 작업을 여러개의 작은 조각으로 recursive하게 쪼개서 수행하여 성능을 높이고자 할 때 사용한다.

ExecutorService 주의점

  • 애플리케이션 종료할 때 올바르게 종료시켜야한다.
  • 쓰레드 풀 갯수(특히 fixed 일 때)를 너무 적게하면 애플리케이션 성능이 떨어지고 너무 많이하면 불필요한 쓰레드 생성 오버헤드가 증가한다. 갯수 조정에 주의할 것.
  • 취소된 Futureget()을 호출하지 말것.
  • Future.get()에 timeout을 적용하여 너무 오래 blocking 하지 않게 할 것.
java/concurrent/executorservice.1457271761.txt.gz · 마지막으로 수정됨: 2016/03/06 22:12 저자 kwon37xi