[컴][자바] TimerTask 를 주기적으로 실행할 때 주의할 점



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();
            }
        }
    }
}

댓글 없음:

댓글 쓰기