2011-03-16 5 views
1

java.util.Timer.scheduleAtFixedRate()를 사용하여 일정 간격으로 일정한 시간에 TimerTask를 실행하도록 예약했습니다. TimerTask에는 6 시간의 지속 시간 동안 실행을 제어하는 ​​논리가 있습니다. 타이머는 다음 날 동일한 시간에이 작업을 시작한다고 가정합니다. 그러나 가끔씩 작업은 해당 작업이 끝난 직후에 다시 시작됩니다. 나는이 사건의 어떤 패턴도 보지 못했다. 단지 무작위로 일어난다. 이 응용 프로그램을 여러 번 실행하여 테스트했지만 특정 패턴을 식별하지 못했습니다.이상하게 행동하는 java.util.Timer

이와 비슷한 내용입니다.

class App{ 
    public static void main(final String[] args) { 
    Timer timer = new Timer(); 
    ProcessManagerTask processManager = new ProcessManagerTask() 
    timer.scheduleAtFixedRate(processManager, today @ 01 AM, 1440 minutes)) 
    //some logic to keep this running forever 
    } 
} 

public class ProcessManagerTask extends TimerTask { 
    public ProcessManagerTask(){ 
    //end time = today @ 7 AM 
    } 
    public void run() { 
    while(end time is not expired){ 
     //do some stuff 
    } 
} 

(작업이 끝난 경우) ProcessManagerTask 언젠가 7 즉시 다시 시작합니다.

EDIT : Timer에 문제가 나타나는 이유를 아는 사용자가 있습니다. 나는 아직도 알아낼 수 없다.

EDIT [2011 년 4 월 8 일] : 타이머 문제는 여전히 해결되지 않습니다. 어떤 사람이 도울 수 있으면 감사 할 것입니다.

+1

[ScheduledExecutorService] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html)를 사용하는 것이 좋습니다. – mre

+1

프로그램을 다시 시작하는 데 문제가있을 수 있습니까? 이게 어디에서 뛰고 있습니까? – jzd

+0

귀하의 질문을 명확하게 이해하지 못합니다. 운영 체제가 Windows에서 실행되는 것을 의미하는 경우. 이 응용 프로그램은 Windows 서비스로 실행되지만 명령 프롬프트를 실행해도이 문제가 발생합니다. – Amit

답변

1

:

실행이 어떤 이유로 지연 될 경우 (예 : 가비지 컬렉션이나 기타 백그라운드 작업 등), 두 개 이상의 실행은 "들어 보자."를 연속해서 발생합니다

따라서 작업이 정확히 오전 1시에 실행되지 않아서 두 번 실행 된 것으로 보입니다.

+0

다음 실행 전에 충분한 시간을주는 고정 시간에 프로세스가 중지되도록 제어됩니다. 오전 1시에 시작하고, 오전 7시에 끝나고, 다음 달은 오전 1시에 실행됩니다. – Amit

+0

데이빗 당신이 옳았다는 것은 다음 일정 시간을 지나치게 통과했기 때문입니다. 감사! – Amit

1

Windows에서 실행하기 때문에. 한 가지 옵션은 예약 된 작업을 사용하여 매일 업무를 시작하는 것입니다. 큰 이점은 시스템이 다시 시작된 후에도 작업이 계속 실행된다는 것입니다. 명령 줄에서 시작되는 무언가가 다시 시작되어야합니다. 워드 프로세서

+0

이 문제를 해결하기 위해이 응용 프로그램을 Windows 시작시 자동 시작으로 설정된 Windows 서비스로 변환했습니다. – Amit

+0

@Amit, 좋습니다. 그러나 예약 된 작업은이 프로그램이 아무 것도 폴링하지 않고 항상 실행 중이어야하기 때문에 더 나은 옵션처럼 보입니다. – jzd

+0

이것은 실제 문제를 완전히 해결하지 못하도록하는 임시 해결책과 비슷합니다. – mre