2011-01-26 5 views
1

클록 응용 프로그램을 작성하면 Thread.sleep(1000) 메서드를 사용하여 매초마다 short seconds 값을 늘려야 할 필요가 있습니까?시간 범위를 계산하는 가장 좋은 방법은 무엇입니까?

동시에 수백만 개의 클럭을 실행하면 제대로 작동합니까?

+2

@AndriodNoob는이 질문에 유래에 가장 적합합니다, P.SE가 아닙니다. –

답변

2

아니요, 스레드가 실제로 다음에 실행될 때 CPU 스케줄러에 달려 있기 때문에 Thread.sleep (1000)에 의존 할 수 없습니다. 당신이 적절한 시간 서비스 (원자 시계)와 동기화 하지 않는 사실 시간에서 자연 편차를 얻을 수 있도록

그 위에

, CPU 타이밍은 정확히 정확하지 않습니다.

하지만 실제로 '수백만 클럭'을 실행하려는 경우, 업데이트되는 단일 타이머를 사용하고 시계의 각 인스턴스에 해당 타이머에 오프셋을 저장하는 것이 더 나을 것입니다.

또한 스레드가 잠자기 시간을 줄이고 적절한 초만 업데이트함으로써 정확도를 높일 수 있습니다. 위에서 언급했듯이 잠자기 시간은 입니다.은 보장되지 않습니다. 즉, 10ms 동안 잠자기해도 10 초 이내에 반환하지 않는 것이 기술적으로 가능합니다 (또는 <<insert arbitrary time here>>

0

일반적으로 초를 최소한 초당 몇 번 업데이트해야합니다. 당신은 하나 개 스레드 수면과 seconds 값을 업데이트를 갖고 싶어 거기에서,

모든 가능한 경우. 실제 시계와 동기화 거의 전체 초, 그리고 이벤트의 우선 순위 큐를 가질 수 업데이트가있을 때마다 시계는 우선 순위 대기열 앞의 이벤트를보고 시간에 도달하면 처리하고 다음 이벤트를 확인합니다.

0

자바 동시 API 패키지를 살펴보십시오. 멀티 스레딩 및 비 블로킹 알고리즘을 처리하는 새로운 API가 많이 있습니다.

예를 들어, 프로그램에서 Thread.sleep (1000)을 호출하는 대신 [ScheduledExecutorService] [1]을 설정하고 매 초마다 실행되도록 작업을 예약 할 수 있습니다. 이렇게하면 코드가 호출되며이를 사용하여 시계 틱을 업데이트합니다. 이렇게하면 코드를 더 많은 생산자/소비자 모델로 옮길 수 있습니다.

Java 5에서는 스레드에 대한 낮은 수준의 액세스 (즉, 대기/알림)의 필요성이 완화됩니다. 자바 동시 패키지에 새로운 물건 몇 가지를 살펴 보자

[1] : http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable는, 오래, 오래, java.util.concurrent.TimeUnit을)

관련 문제