2017-10-31 3 views
1

TimerTask 개체의 run 메서드에서 timerTask 자체를 다른 타이머에 어떻게 제출할 수 있습니까? timerTask가 실행 중일 때 판단을 내려야하고 작업을 수행 할 수 있는지 여부를 결정해야합니다. 조건을 충족시키지 못하면 취소하고 다른 타이머에 넣어야합니다. TimerTask의 코드는 다음과 같습니다.TimerTask를 실행 중일 때 다른 타이머에 제출하는 방법

@Override 
public void run() { 
    try { 
     if (flag) { 
      // do something 
     } else { 
      new Timer().schedule(this, 1000 * 60); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

사용할 수 있습니까?

+1

일부 코드 게시 도움이 될 것입니다 – Kovalainen

+0

'타이머'를 하나만 사용하고 '스레드', '실행 가능'또는 다른 '타이머'와 같은 외부 조건을 모니터링해야합니다. 그런 다음 필요에 따라 외부 모니터에서 타이머를 중지, 취소, 다시 할당하십시오. – Zabuza

답변

1

Thread, Runnable 또는 Timer과 같이 외부에서 조건을 모니터링해야합니다. 그런 다음 필요에 따라 외부 모니터에서 타이머를 중지, 취소, 다시 할당하십시오. 여기


TimerTask입니다 :

public class OurTask extends TimerTask { 
    @Override 
    public void run() { 
     // Do something 
    } 
} 

을 그리고 여기에 모니터의 :

연습에 Monitor 또한 외부에서 취소 얻을 수 있어야하는 것으로
public Monitor implements Runnable() { 
    private Timer mTimerToMonitor; 

    public Monitor(Timer timerToMonitor) { 
     this.mTimerToMonitor = timerToMonitor; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      if (!flag) { 
       // Cancel the timer and start a new 
       this.mTimerToMonitor.cancel(); 
       this.mTimerToMonitor = new Timer(); 
       this.mTimerToMonitor.schedule(...); 
      } 

      // Wait a second 
      Thread.sleep(1000); 
     } 
    } 
} 

, 현재는 무한히 실행 .

는 그리고 이것은 당신이 그것을 호출 할 수있는 방법입니다 :

Timer timer = new Timer(); 
timer.schedule(new OurTask(), ...); 

Thread monitorThread = new Thread(new Monitor(timer)); 
monitorThread.start(); 

가 대신 Runnable, TimerThread를 사용하는이 새로운 자바 8 물건으로 살펴 본다 가치가있을 수 있습니다, 특히 인터페이스 Future과 그것을 구현하는 클래스.

관련 문제