2013-12-09 1 views
1

각 작업 후에 일시 중지가 필요한 단일 스레드 프로그램을 작성하고 있습니다. (일시 중지 = 1 ~ 60 초 사이의 임의 값).Thread.sleep (60 * 1000)은 내 프로그램을 30 분 이상 잠자기 상태로 만듭니다.

그래서 이런 쓴 방법 : 프로그램 로그를 통해보고있는 동안

public void freeze() throws InterruptedException { 
    Thread.sleep(nextFreezeDurationSec * 1000); 
    calculateNextFreezeDuration(); 
} 

나는 문제를 발견했다.

public void freeze() { 
    long nextFreezeEnd = System.currentTimeMillis() + (nextFreezeDurationSec * 1000); 
    while (System.currentTimeMillis() < nextFreezeEnd) { 
     /*NOR*/ 
    } 
    calculateNextFreezeDuration(); 
} 
: Аpparently, 나 이유에 대한 몇 가지 알 수없는 위해, 500-700 작업 후에는

(이 시간보다 큰 번) 그리고 나는 다른 방법을 쓴 시간의 훨씬 더 큰 금액을 잠 내 프로그램을두고

이 코드는 정상적으로 작동합니다. 그러나 그것은 CPU를 미친 것처럼 먹습니다.

이 문제에 대한 조언을 보내 주시면 감사하겠습니다.

+0

무엇인가? –

+2

아마도'calculateNextFreezeDuration()'도 포함시킬 수 있을까요? 'nextFreezeDurationSec'의 값을 로깅하여 예상 값인지 확인해 보셨습니까? – turbo

+0

여기 있습니다. 정말 특별한 것은 없습니다. 개인 무효 calculateNextFreezeDuration() { setNextFreezeDurationSec ( random.nextInt (maxLimitSec - minLimitSec) + minLimitSec ); } – nikopol86

답변

0

while 루프에서 nextFreezeDuration을 지속적으로 계산하므로 두 번째 것은 CPU를 먹는 것입니다.

while 루프가 완료 될 때까지 무한히 반복 될 때마다 계산이 수행됩니다. 그것을시키기 전에 적어도 밀리 초 몇 기다리 화장을하는 방법을 연구 그것은 될 수 while 루프

관련 문제