2013-03-27 1 views
1

TimerTask를 사용하여 매일 실행하도록 스레드를 예약하고 있습니다. 여기에 코드가 있습니다.자바에서 TimerTask로 일정이 비정상적으로 지연됩니다.

private void scheduleDailyProcess() { 
    Calendar c = Calendar.getInstance(); 
    c.add(Calendar.DATE, 1); 
    c.set(Calendar.HOUR_OF_DAY, 0); 
    c.set(Calendar.MINUTE, 5); 
    c.set(Calendar.SECOND, 0); 
    c.set(Calendar.MILLISECOND, 0); 

    Timer timer = new Timer(); 

    int period = 24 * 60 * 60 * 1000; //24 hours 
    timer.schedule(new DailyProcess(), c.getTime(), period); 
} 

매일 00:05에 스레드를 실행하고 싶습니다. 그러나 스레드가 8 초의 지정되지 않은 지연으로 시작한다는 것을 알았습니다.

코드에 뭔가 빠졌습니까? 아니면 TimerTask에 문제가 있습니까?

DailyProcess 내에 지연이 없습니다.

+0

어디에서 델타를 얻고 있습니까? 프로그램에 타이밍 출력이 있습니까? – Max

+0

예 로그에서 8 초 지연을 볼 수 있습니다. –

+0

'TimerTask'는 정확한 실행 시간을 약속하지 않습니다. 사실, 문서화는 그것에 대해 아주 명백합니다. 정밀도가 필요하다면 Quartz 프레임 워크 -> http://quartz-scheduler.org/를 사용하는 것이 좋습니다. –

답변

1

이 작업 전에 다른 작업이 실행되어 DailyProcess의 초기 실행이 지연 될 수 있습니다. TimerTask를 문서 따르면

:

각 타이머 오브젝트에 대응 순차적 타이머의 모든 작업을 수행 에 사용되는 단일 배경 스레드이다. 타이머 작업은 신속하게 완료되어야합니다. 타이머 작업이 완료되는 데 과도한 시간이 걸리면 타이머 작업 실행 스레드가 "호그 (hog)"됩니다. 이것은 차례로, 후속 작업의 실행을 지연시킬 수 있습니다. 후속 작업은 위반 작업이 마침내 완료 될 때 (그리고 가끔씩) 연속적으로 "묶어"실행할 수 있습니다.

+0

DailyProcess는이 타이머 개체에 의해 실행되는 유일한 스레드입니다. 앞이나 뒤에 다른 TimerTask가 없습니다. –

+0

TimerTask의 설명서를주의 깊게 읽으십시오. 시스템이 지정된 시간에 작업을 실행하려고 시도하는 동안 사용자가 지정할 때 시스템이 정확히 실행될 것이라는 보장이 없으며 일부 표류를 야기 할 수있는 몇 가지 요인이 있습니다. 일일 작업의 8 초 오프셋이 작업에 받아 들여지지 않으면 TimerTask에 의존 할 수 없습니다. – JohnnyO

+0

8 초 지연이 허용됩니다. 해명 해줘서 고마워. –