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();
}
}
}
}
댓글 없음:
댓글 쓰기