2010-08-12 4 views
6

ntp를 사용하는 상자가 있고 시계를 표시하는 여러 Java 프로그램이 있습니다. 우리가 겪고있는 문제는 시스템 클럭이 시스템 클럭을 움직이게하는 것과 같은 일을하는 모든 타이머를 거꾸로 뒤집어서 시스템 시간이 원래의 위치로 되돌아 갈 때까지 기다리는 것입니다. 나는 시스템 시간이 거꾸로 바뀌었을 때를 감지하고 반복적으로 스케줄을 잡을 수있는 타이머 세트를 모두 재설정 할 수있는 방법을 찾아야한다.java 또는 시간 증명 타이머에서 시스템 시간이 거꾸로 이동했는지 감지합니다.

메모로 저는 이미 쿼츠 타이머 패키지를 시험해 보았습니다. 일반적인 자바 타이머와 같은 문제가 있습니다.

+0

시계가 얼마나 먼 곳입니까? ntp는 일반적으로 클럭 슬 루 (clock slew)를 사용하여 시계 방향으로 조금씩 움직이며 몇 초 동안 변경하지 않아도됩니다. – Gray

+0

시스템에 3 ~ 4 시간 정도의 시간을 허비하는 버그가 있습니다. 거의 우리가 동의 할 수없는 2 개의 경쟁 ntp 서버가있는 것 같습니다. – tharris

답변

5

거의 모든 타이머가 미래의 시간을 설정 한 다음 현재 시간을 주어진 시간과 정기적으로 비교합니다. 실시간 타이머가 뒤로 돌아 가면 타이머가 "멈추는"이유입니다.

불행히도 JVM의 모든 타이머는 시간과 관련이 있습니다. 예를 들어, java.util.Timer는 이벤트가 발생하기 위해 Object.wait (milliSeconds)를 수행합니다. 그것은 밀리 세컨드 동안 대기를하는 쓰레드 호출로 귀결됩니다. 그리고 그것은 항상 "시간"과 관련이 있습니다.

기본적으로 Java에서 회전을하지 않고 CPU를 빠져 나가는 루프는 뒤로 이동해야하는 시간을 기다리며 루프를 재설정하려고하는 타이머에 알립니다.

+0

그래도 나는 무엇을 생각해 냈는지에 대해서 말하지만, Thread.sleep()이 시스템 클럭에 영향을받지 않는다는 것을 알았다. 그래서 나는 1을 위해 잠들 수있는 스레드를 가질 수 있다고 생각한다. 그런 다음 시간이 뒤로 이동했는지 확인합니다. – tharris

1

시계 위젯이 고장난 것 같습니다. UI 위젯은 모델의 현재 상태를 표시해야하며 여기서 모델은이 경우 시스템 시간입니다. 물론, 시계의 경우 초당 repaint()을 예약해야하지만, 다시 칠하기가 발생하면 시스템 시간을 렌더링하고 시간 자체를 추적하지 않아야합니다.

이 원칙은 비 UI 구성 요소에도 적용됩니다. 구성 요소의 타이밍 오류에 대한 허용 오차를 확인하고 해당 간격으로 구성 요소를 새로 고치는 백그라운드 스레드가 있어야합니다. 그러나 새로 고치는 동안 독립적 인 내부 시계가 아닌 시스템 시간이 사용됩니다.


업데이트 : 기본 ScheduledExecutorService

적어도 내 플랫폼에서,이 문제에서 고통을하지 않습니다.

ScheduledExecutorService worker = Executors.newScheduledThreadPool(1); 
worker.schedule(new Runnable() { 
    public void run() 
    { 
    update(); 
    } 
}, 100, TimeUnit.MILLISECONDS); 
+0

위젯이 시간 자체를 추적하려고하는 것이 아니라 새로운 Date()를 한 번씩 호출하는 것입니다. 시스템 시간을 거꾸로 이동하면 실제로 시계를 업데이트/애니메이션하는 타이머가 실행을 일시 중지합니다. 시스템은 이전의 위치로 되돌아갑니다. – tharris

+0

@tharris - 알겠습니다. 나는 전에 그 문제에 부딪치지 않았다. 그러나, 내가 사용하는'ScheduledExecutorService' 구현은 문제의 영향을받지 않는 것으로 보이며,'Timer' 클래스와 비슷한 API를 가지고 있습니다 (더 새롭고 훨씬 강력한'java.util.concurrent' 패키지의 일부 임에도 불구하고). 예를 보려면 내 업데이트를 참조하십시오. – erickson

+0

@erickson :(이것은 우분투 11.10 자바 6 업데이트와 함께 작동하지 않습니다 26. 나는 또한 지금 http://stackoverflow.com/questions/9044423/java-scheduler-which-is-completely-independent-of에 대한 질문을 가지고 있습니다. -system-time-changes – YoK

관련 문제