2011-07-27 3 views
1

scheduleAtFixedRate 메서드를 사용하여 매시간 데이터베이스에 대한 업데이트를 제공하기 위해 ScheduledExecutorService을 사용하고 있습니다. 문제는 점차적으로 나중에 도착한다는 것입니다. 장기간 서비스를하면서 로깅을하고 있으며 하루에 두 번째입니다.scheduleAtFixedRate slow/late

저는이 측면을 검사하기 위해 작은 클래스를 만들었습니다. WinXP를 실행하는 PC에서는 아무 일도 일어나지 않지만 상황이 빠르게 진행되면 제대로 작동하는 것처럼 보입니다. 18:00:00.5 지난 밤 첫 로그이었고, 오늘 아침에 내 예는 작은 아니지만 내가 코드를 첨부 할 수 있습니다

09:00:00.5 다음 10:00:05.9, 11:00:26.8, 12:00:45.3, 13:01:07.8 ...이었다.

누구든지이 경험이 있으십니까? 이 아이디어가 제대로 작동하지 않는 이유는 무엇입니까?

나는 그 주위에 여러 가지 방법을 생각할 수 있지만 광고 된대로 작동하지 않는 이유를 알고 싶습니다.

감사합니다, 마이크

답변

2

이것은 일반적인 AFAIK입니다. scheduleAtFixedRate을 사용하면이 작업의 실행이 해당 기간보다 오래 걸리면 후속 실행이 늦게 시작될 수 있습니다. 즉, 나는 scheduleWithFixedDelay을 권하고 싶습니다. 이렇게하면 지정된 지연 간격으로 작업이 수행됩니다.

+0

아니요, JavaDoc에 따르면 각 실행 기간은 중요하지 않습니다. '장기적으로 실행 빈도는 지정된 기간의 역수가됩니다 (시스템 클럭이 Object.wait (long) 정확합니다. " – Thomas

+0

@ 토마스, 당신은 링크를 제공 할 수 있습니까? – Moonbeam

+0

@ 몽구스 방금 수업을 잘못 들었습니다.'ScheduledExecutorService' 대신에'Timer'입니다. 그러나 당신이 링크 한 JavaDoc은 답을 다른 말로 표현한다 :'scheduleAtFixedRate'는 정확히'initial_delay + n * rate'에서 시작해야한다. 반면에'scheduleWithFixedDelay'는 태스크의 지속 시간을 고려할 것이다 :'... 주어진 지연 한 실행 종료와 다음 시작 (scheduleWithFixedDelay) 사이 – Thomas