2013-07-11 2 views
4

우리는 1000 초마다 작업을 실행하려고합니다. Timertask.scheduleAtFixedRate는 시계가 변경되면 어떻게해야합니까?

그래서 우리는

timer.scheduleAtFixedRate(task, delay, interval); 

는 대부분이 잘 작동합니다. 그러나 이것은 임베디드 시스템이며 사용자는 실시간 시계를 변경할 수 있습니다. 타이머를 설정 한 후 과거에 설정 한 시간이라면 원래의 실시간 날짜/시간까지 타이머가 실행되지 않는 것으로 보입니다. 3 일 후에 타이머를 설정하면 (

자바 라이브러리의 허용되는 동작 또는 결함입니까? 여부를 시스템 클럭의 기본 가치.

이 허용 있다면, 우리는이 시계의 변화를 파악하고 우리의 타이머를 다시 예약?

+0

시간을 3 일 앞으로 설정하면 무한대로 실행됩니다 (별로는 아니지만 내가 무슨 뜻인지 알고 있습니다). – pstanton

답변

11

자바 1.7 Timer의 소스를 보면 어떻게, 그 사용입니다 나타납니다 System.currentTimeMillis()을 사용하여 다음 작업 실행을 결정하십시오.

그러나 l ScheduledThreadPoolExecutor의 소스에서 System.nanoTime()을 사용합니다.

Timer 대신 하나를 사용하면 해당 동작을 볼 수 없습니다. 생성하려면 Executors.newScheduledThreadPool()과 같이 사용하십시오. 이 동작을 볼 것입니다 왜

때문에 System.nanoTime()에 대한 문서의 말씀입니다 :이 방법 만 경과 시간을 측정 할 수 있으며, 시스템 또는 벽의 다른 개념과 관련이 없습니다

-시계 시간. 고정 된 값이지만 임의의 원점 시간 이후에 반환 된 값은 나노초를 나타냅니다. [emphasis mine]. 이것은 어쩌면, Timer의 버그인지 여부에

... ScheduledExecutorService 달리 Timer 절대 시간을 지원하고, 어쩌면이 System.currentTimeMillis()의 사용이 설명하는 것이

참고; 또한 Timer은 Java 1.3 이후에 있었으며 System.nanoTime()은 1.5에만 나타났습니다.

그러나 System.currentTimeMillis()을 사용하면 Timer은 시스템 날짜/시간에 민감합니다 ... 그리고 javadoc에 설명되어 있지 않습니다.

+2

+1 출처를보고 같은 결론에 도달했습니다. 아마 조금 더 잘 문서화되어야합니다. – assylias

+0

내가 필요로하는 것만 보이지만 Java 1.5 이상입니다. 우리는 1.4 :(Backports of JSR-166)을 사용해야하지만 날짜/시간 설정의 변경에 영향을받지 않는 일종의 실시간 클럭에 의존하고 있습니다. 우리 환경에 그런 것이 있는지 여전히 찾고 있습니다. ... –

+0

어, 미안 해요, 1.4 전혀 : (나는 backport-util-concurrent라는 패키지를 알고 있지만 실제로'System.nanoTime()'은 또 다른 문제입니다 ... 1.4라면, – fge

3

이 누락 된 사형 집행을 "따라 잡기"어떤 지체없이 여기 http://bugs.sun.com/view_bug.do?bug_id=4290274

시스템 시계는 나중에로 설정되어있는 경우 마찬가지로, 작업을 실행할 수 있습니다 여러 번보고됩니다. 정확하게 이것은 컴퓨터가 대기 모드/최대 절전 모드로 설정되고 응용 프로그램이 다시 시작될 때 발생합니다 (이것이 내가 발견 한 방법입니다).

이 문제는 Java 디버거에서 타이머 스레드를 일시 중단하고 다시 시작하여 볼 수 있습니다.

+1

"시스템 시계가 나중에 설정되면 작업이 여러 번 실행될 수도 있습니다."이것은 의존하는 것처럼 보입니다. IBM j9 시스템이 있는데, 그 대신에 한 번 불을 껐다가 나중에 반복적으로 연결되지 않은 상태로 반복되고 예상대로 반복됩니다. 우리는 아직 완전히 특성화하지 않았습니다. 우리는 ScheduledExecutorService로 이동하려고합니다. –

+0

오클라호마를 사용하고 있습니다. Windows의 Java. –

관련 문제