2017-09-19 5 views
0

기다립니다. 내가 doMoreStuff을 계속하기 전에 어떤 것이 실행되고 있다면 doStuff가 끝날 때까지 기다려야합니다.자바 TimerTask를 다음과 같은 예를 생각해 마지막 작업

여기에 사용할 수있는 waitUntilFinished 메소드를 추가하는 (합법적 인) 방법이 있습니까? 아니면 java.util.Timer 클래스를 내 자신에게 복사하고 메소드를 직접 구현해야합니까?

답변

0

TimerTask는 비동기식으로되어 있습니다.

스레드 관리를 올바르게 구현해야합니다. Executors 또는 스레드 풀을 사용하여 작업 실행 수명주기를 모니터링합니다.

+0

다른 스레드를 사용하는 것이 더 쉽지 않습니까? – Wietlol

+0

비동기인지 여부에 따라 다릅니다. doStore()가 완료되면 doMoreStuff()가 실행됩니까? – oldmanswit

+0

doMoreStuff()는 doStuff()에서 사용하는 Closeables 중 일부를 닫습니다. 간단히 말하자면 doStuff()에 의존하고 다시 실행하지 않습니다. – Wietlol

0

명시 적 잠금으로이 작업을 수행 할 수 있습니다.

작업이 잠금을 얻기 위해 doStuff()을 필요로하고 잠금을 해제 할 수 없으면 뒤로 물러나야합니다. 사실 결코 다시 시도하지 않습니다. doSuff().

stop() 메서드는 Timer 및 잠금을 취소합니다. 잠금이 해제 될 때까지 차단되므로 doStuff()이 계속되면 대기해야합니다. 잠금 기능이 해제되면 명시 적으로 작업이 비활성화되므로 잠금을 해제 한 후에는 나머지 작업을 더 이상 doStuff()하지 않습니다.

public class TimerStuff { 

    private Timer myTimer; 
    private Lock lock; 
    private ScheduledTask scheduledTask; 

    public void start() { 
     lock = new ReentrantLock(); 
     myTimer = new Timer(); 
     scheduledTask = new ScheduledTask(lock); 
     myTimer.schedule(scheduledTask, 0, interval); 
    } 

    public void stop() { 
     myTimer.cancel(); // stop the scheduling 
     lock.lock(); // if doStuff is busy, we'll block until it's finished, once we have the lock the task cannot doStuff() 

     try { 
      scheduledTask.disable(); // once we release the lock, the task won't attempt to run again 
      doMoreStuff(); // we're certain doStuff() isn't running, and won't run after this 
     } finally { 
      lock.unlock(); 
     } 

    } 

    private void doMoreStuff() { 
     //*** 
    } 

} 

class ScheduledTask extends TimerTask { 
    private final Lock lock; 
    private volatile boolean mayRun = true; 

    public ScheduledTask(Lock lock) { 
     this.lock = lock; 
    } 

    @Override 
    public void run() { 
     mayRun = mayRun && lock.tryLock(); 
     if (mayRun) { 
      try { 
       doStuff(); 
      } finally { 
       lock.unlock(); 
      } 
     } 
    } 

    public void disable() { 
     this.mayRun = false; 
    } 

    private void doStuff() { 
     // ... the stuff 
    } 


} 
관련 문제