2014-01-29 3 views
3

클라이언트가 구성을 다시로드하도록 요청할 수있는 서버 측 응용 프로그램이 있습니다. 클라이언트가 구성을 다시로드하도록 요청한 경우 즉시 완료해서는 안되지만 지연 시간은 1 분입니다. 다른 클라이언트가 같은 분에 구성을 다시로드하도록 요청한 경우이 요청은 무시해야합니다.ScheduledExecutorService - 예약 된 작업이 이미 완료되었는지 확인하십시오.

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES); 

public class LoadConfigurationTask Runnable { 
    public void run() { 
     // LoadConfiguration 
    } 
} 

가 어떻게이 LoadConfigurationTask가 예정되어 있지만이 구성 될 때까지 추가 요청을 무시 할 수 있도록, 아직 실행 여부를 확인 할 수 있습니다

내 생각은 같은 ScheduledExecutorService를 함께 작업을 예약하는 것입니다 다시로드?

+0

다시로드 구성 작업이 실행중인 경우 - 다른 요청도 무시해야합니까? 작업이 1 밀리 초 전에 완료되면 어떻게됩니까? –

+0

아니요 실행중인 경우 아니요, 새 작업을 예약해야합니다. – markus

답변

3

가장 쉬운 방법은 당신이 작업을 시작할 때, 사실에 AtomicBooleanhttp://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html

설정으로 설정이 거짓에있는 경우가 아니면 작업 완료는, 더 이상 실행되지 않는 경우 false로 설정하는 것입니다.

finally 블록에서 false로 설정하여 실수로 설정을 해제하지 않고 종료 할 수 없도록하십시오.

25

당신은 단순히 이런의 ScheduledFuture에 대한 참조를 얻을 수 있습니다 : 미래와 지금

ScheduledFuture<?> schedFuture = service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES); 

을, 당신이 작업이 완료되면 확인할 수 있습니다 더 나은

schedFuture.isDone(); 

또는를 어떻게 확인 실행이 시작되기까지 남은 많은 시간 :

schedFuture.getDelay(TimeUnit.MINUTES); 

외부 변수가 필요하지 않습니다. 전자 상태를 추적합니다.

+3

승인 된 대답이어야합니다. – UniversE

관련 문제