TimerTask.cancel 사용시 주의할 점
TimerTask.cancel() 을 잘 파악하지 못하고 썼다가, 갑자기 task 가 동작 되지 않는 현상이 발생했다. 이유를 파악해 보니 TimerTask.cancel() 때문이었다.
아래처럼 Timer 에 TimerTask 를 등록해서 주기적으로 동작하는 경우에 TimerTask 가 error 가 나는 경우에 현재 TimerTask 를 멈춘다고 TimerTask.cancel() 을 사용하면 안된다.
API 문서에서도 cancel() 을 실행하면 schedule 된 TimerTask 들도 전부 실행이 되지 않는다고 얘기하고 있다.
If the task has been scheduled for repeated execution, it will never run again
Test Code
간단하게 아래 코드로 테스트 해 볼 수 있다.cancel() 을 사용하지 않은 코드
public class Test { public static void main(String[] args){ TimerTask task = new RunMeTask(); Timer timer = new Timer(); timer.schedule(task, 1000,6000); } public static class RunMeTask extends TimerTask { @Override public void run() { System.out.println("Run Me ~"); try{ throw new Exception(); }catch (Exception e){ System.out.println("error"); } } } }
cancel() 을 사용한 코드
public class Test { public static void main(String[] args){ TimerTask task = new RunMeTask(); Timer timer = new Timer(); timer.schedule(task, 1000,6000); } public static class RunMeTask extends TimerTask { @Override public void run() { System.out.println("Run Me ~"); try{ throw new Exception(); }catch (Exception e){ System.out.println("error"); cancel(); } } } }
댓글 없음:
댓글 쓰기