2017-03-18 1 views
3

TimerTask을 500ms 후에 실행해야하는 Java 응용 프로그램이 있습니다. 그러나 특정 이벤트가 발생하면이 작업의 타이머를 재설정해야합니다. 실행하려면 500ms를 더 기다려야합니다.) 나는 전체 수업에 대해 timer을 선언했다. 이 문제를 해결해야하지만 내가 줄 timer = new Timer()에서 그것을 reinitialising 생각 나는 timer.cancel()를 사용하는 경우 내가 타이머 객체를 재사용 할 수 있다는 사실을 알고Java - 호출 후 타이머 객체 재사용

public static void main(String[] args) { 

    if (curr_pck == my_pck) { 
       timer.cancel(); 
       timer.purge(); 
       timer = new Timer(); 
       timer.schedule(new TimerTask() { 
        @Override 
        public void run() { 
         myTask(); 
        } 
       }, 500); 
      } 

} 


public static void myTask() { 

    timer.cancel(); 
    timer.purge(); 

    timer = new Timer(); 

    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      myTask(); 
     } 
    }, 500); 

    //EXECUTE CODE WHICH ISN'T RELEVANT TO THE QUESTION 

} 

: 나는 다음과 같은 코드를 사용합니다. 이 주위에 어떤 방법이 있습니까? myTask() 함수 내에서 라인 timer.schedule(new TimerTask() {

예외 : 당신은 자바의 스윙 타이머를 체크 아웃 할 수 있습니다

java.lang.IllegalStateException: Timer already cancelled.

+0

당신은 이것에 대한 [MCVE] 작성하고 정확하고 완전한 오류를 표시해야합니다 귀하의 리셋 수행 예를

private Timerr timer = new Timerr(); 

을 만듭니다. – pvg

+0

문제를 재현하는 전체 예제와 예외의 전체 스택 추적을 게시하십시오. –

+0

질문에 대답하기 위해서는 변수의 범위를 아는 것이 필요합니다. 더 많은 코드와 스택 추적을 게시하십시오. –

답변

-2

. 다소 다르게 작동하며 내부 클래스 또는 액션 리스너를 작성해야하지만 스윙 타이머에는 .stop() 및 .restart()가 포함되어있어 애플리케이션에서 더 잘 작동하는 것처럼 보입니다.

+1

스윙의 타이머가 EDT에서 작업을 실행합니다. 따라서 실제로는 Swing 응용 프로그램에만 적합합니다. – RealSkeptic

+0

Swing 응용 프로그램이라는 것을 알지 못하면이 대답이 잘못되었습니다. –

-1

적절한 방법으로 Timerr 클래스를 만듭니다. 그런 다음 일반 타이머처럼 액세스하십시오.

public class Timerr 
{ 
    private Timer timer; 

    public Timerr() 
    { 
     timer = new Timer(); 
     start(); 
    } 

    public void start() 
    { 
     timer.schedule(new TimerTask() 
     { 
      @Override 
      public void run() 
      { 
       System.out.println("hi"); 
      } 
     }, 500); 
    } 

    public void reset() 
    { 
     timer.cancel(); 
     timer.purge(); 
     start(); 
    } 
} 

if(condition) 
{ 
    timerr.reset(); 
}