2012-01-09 2 views
19

Java 코드의 while 루프에서 NetBeans가 Thread.sleep() 사용에 대해 경고한다는 것을 알게되었으므로이 주제에 대한 연구를 수행했습니다. 주로 문제는 성능 중 하나 인 것 같습니다. 카운터가 아직 자고있는 동안 while 상태가 참이 될 수 있으므로 다음 반복을 기다릴 때 벽 시계 시간을 낭비합니다. 이 모든 것이 완벽하게 이해됩니다.while 루프의 Thread.sleep()

내 응용 프로그램은 원격 시스템에 접속하여 주기적으로 작업 상태를 폴링하고 작업이 완료 될 때까지 기다렸다가 다음 요청을 전송해야합니다. ,

String state = get state via RPC call 
while (!state.equals("complete")) { 
    Thread.sleep(10000); // Wait 10 seconds 
    state = {update state via RPC call} 
} 

(즉, 그것은 몇 초 동안 실행에, 다소 비싼 과정) 상황이 원격 조작을 확인하는 것을 감안할 때이 스레드의 유효한 사용하는 것입니다 : 순간 코드는 논리적으로한다. while 루프에서 sleep()? 이 논리를 구성하는 더 좋은 방법이 있습니까? Timer 클래스를 사용할 수있는 몇 가지 예제를 보았습니다.하지만 여전히 똑같은 직관적 인 논리로 종결되는 것처럼 보이지만 더 많은 복잡성이 던져진 것처럼 이점을 보지 못했습니다.

베어 이 경우 원격 시스템은 직접 제어 할 수도없고 Java로 작성된 것도 아니므로이 시나리오를이 시나리오에서보다 "협조적"으로 변경하는 것은 선택 사항이 아닙니다. 상태에 대한 내 응용 프로그램의 가치를 업데이트하는 유일한 방법은 XML 메시지를 작성하여 보내고 응답을 수신하고 구문 분석 한 다음 필요한 정보를 추출하는 것입니다.

모든 의견이나 의견을 환영합니다.

+0

가 완벽하게 권리입니다. 경고를 피하는 방법은주기 동안 do를 사용하는 것입니다. – kenota

+2

RPC 호출 상태를 폴링하는 데 드는 비용은 10 초간 잠을 자야 할 정도로 높을 필요가 있다고 생각합니다. 1 초가 더 합리적인 것이거나 이전 수면 작업의 수에 따라 더 긴 시간 동안 기다리는 수면 (특정 최대 과정 포함)입니다. –

+1

내가 언급했듯이 원격 조작은 몇 초 동안 실행된다. 일부 경우를 감안할 때 10 초를 너무 짧게하는 경우가 있습니다. –

답변

12

원격 시스템에서 이벤트를 발행하거나 비동기 적으로 사용자에게 알리지 않는 한, 위의 내용이 모두 불합리하다고 생각하지 않습니다. sleep() 시간 대 RPC 호출의 시간 /로드 균형을 조정해야하지만, 이것이 유일한 문제이며 위의 내용은 전혀 문제가되지 않는다고 생각합니다.

4

리모트 엔드를 변경하지 않고 장기 실행 프로세스로 수행되는 "푸시 (push)"알림을 제공하지 않고도 당신은 할 수있을뿐만 아니라 거의 마찬가지입니다. Thread.sleep 시간이 폴링 비용에 비해 길면 오랜 시간이 걸릴 것입니다.

0

매우 비효율적이며 좋은 습관이 아니므로 절대로 수면을 사용하지 않아야합니다. 스레드가 서로 신호를 보내는 경우 항상 잠금 및 조건 변수를 사용하십시오. 마이크 Dahlin의 Coding Standards for Programming with threads

템플릿은 참조 : (RPC 호출을 완료 할 때 알림을받을 수없는 경우) 나는 당신의 상황에서 생각

public class Foo{ 
    private Lock lock; 
    private Condition c1; 
    private Condition c2; 

    public Foo() 
    { 
    lock = new SimpleLock(); 
    c1 = lock.newCondition(); 
    c2 = lock.newCondition(); 
    ... 
    } 

    public void doIt() 
    { 
    try{ 
     lock.lock(); 
     ... 
     while(...){ 
     c1.awaitUninterruptibly(); 
     } 
     ... 
     c2.signal(); 
    } 
    finally{ 
     lock.unlock(); 
    } 
    } 
} 
+3

이것이 어떻게 도움이 될지 잘 모르겠습니다. –

+0

글쎄, 그는 자신의 논리를 구조화하는 방법에 대해 묻고 있으며 while 루프 내부에서는 조건 변수를 사용하여 지속적으로 사용하지 않고 완료 할 수있는 프로세스가 신호를 보내야한다고 (일반적인 의견으로) 말하고 있다고 생각합니다. 자다. – Cemre

+2

나는 이것이 RPC가 어떤 방식 으로든 폴링되어야한다는 실제적인 문제를 무시한다고 생각한다. 그렇지 않습니까? –