TimerTask와 ExecutorService의 차이점

  • Timer 는 시스템 시간에 의존적임. TimerTask 동작 후 시스템 시간을 변경하면 task 동작 주기도 변경된다는 말. ScheduledThreadPoolExecutor은 그렇지 않음.
  • Timer는 해당 VM안에서 하나의 실행 쓰레드만 가짐. 이런 이유로 긴 시간동안 수행되는 task는 다른 task를 지연시킬 가능성 있음. ScheduledThreadPoolExecutor은 동시 수행될 쓰레드 수를 조절가능하며, 원한다면 ThreadFactory를 통해서, 생성된 쓰레드에 대한 제어권을 획득할 수 있음.
  • TimerTask에서 Runtime exception이 발생하면 그 하나 뿐인 쓰레드가 죽어버림. 고로 모든 나머지 스케줄링된 task들은 더 이상 수행되지 않음.. ScheduledThreadPoolExecutor는 runtime exception을 catch할 뿐만 아니라 ThreadPoolExecutor의 afterExecute 오버라이딩을 통해 익셉션을 핸들링할 수도 있으며 익셉션이 발생한 task는 cancel되지만 나머지 task는 계속 수행 됨.


ScheduledThreadPoolExecutor를 사용할 수 있는 환경이라면 Timer 대신에 ScheduledThreadPoolExecutor를 써라.
[code java]
java.util.concurrent.Executors.newScheduledThreadPool(8);
[/code]

ScheduledThreadPoolExecutor는 java5에 도입되었지만 java1.4 이전 환경을 위한 backport 을 통해
http://backport-jsr166.sourceforge.net/  ScheduledThreadExecutor 클래스를 제공함.

2015/12/10 13:06 2015/12/10 13:06
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다