2011-01-15 3 views
0

wait() 및 notify()/notifyall()과 함께 while 루프를 사용할 수 있습니까?Java 100 % CPU로드없이 끊임없이 모니터 할 수 있습니까?

편집 : waitfornextprice 메서드의 else 조건을 putPrice 메서드에서만 실행하려고합니다.

public synchronized void putPrice(String s,int i) { 
    if (getPrice(s) != i){ 
     this.Prices.put(s, i); 
     notify(); 
    } 
} 

public synchronized int waitForNextPrice(String s) { 
    int b = null; 
    if (hasPriceChanged(s)==true){ 
     b = getPrice(s); 
    } 
    else{ 
     //Need to block here, until putPrice() is called again 
     while(hasPriceChanged(s)==false) wait(); 

     //Once putPrice has been called, b = getPrice(); 
     b = getPrice(s); 
    } 
    return b; 
} 

답변

1

왜 비싼 루프 대신 java.util.Timer를 사용하지 않는?

+0

확인 필자가 상단 – Jason

5

모니터링하려고하는 것이 notify/notifyAll을 호출 할 수 있다고 가정 할 때 일반적인 방법입니다. 그렇습니다.

당신에게 알릴 수없는 경우 대신 폴링 할 수 있지만 wait/notify 인 "푸시"알림이 바람직합니다.

1

일반적으로 대기/알림을 사용하는 것보다 나은 방법이 있습니다. 당신이하려고하는 것을 설명 할 수 있습니까? 아마도 대안을 제안 할 수 있습니다. Java에서 동시성 라이브러리를 사용합니다.

훨씬 나은 구조는 이벤트 기반 처리를 사용하는 것입니다. 가격이 변경되면 특정 작업이 발생하게됩니다. 가격 변경에서 이러한 작업을 실행해야합니다.

public void putPrice(String s,int i) { 
    if (getPrice(s) == i) return; 
    prices.put(s, i); 
    List<Runnable> onChange = priceListeners.get(s); 
    if (onChange==null) return; 
    for(Runnable run: onChange) run.run(); 
} 

Runnable 대신에 어떤 키/가격이 변경되었는지 알리는 인터페이스를 만들 수 있습니다. 이렇게하면 단 하나의 스레드로 가격이 변경 될 수 있습니다. (또는 선택한 적은 수의 스레드)

+0

에 내 코드를 내가 놓을 게요 넣어, 나는 당신의 대답 만의 소리를 좋아한다 솔직히 나는 정말로 그 모든 것을 이해한다고 생각하지 않는다. – Jason

+0

확인 필자에 편집에서하고 메신저 상단 – Jason

+0

안녕 피터에 내 코드를 넣어 무엇을 상단 – Jason

3

루프에서 작은 절전()으로 반복하면 CPU 사용량이 100 %에서 1 %에 가까워집니다. 수면 (50)을 추가하십시오. 루프에

+0

수면을 사용하는 것은 아주 나쁜 생각입니다. 잠을자는 엄지 손가락의 규칙 (즉, 인터럽트를 기다리지 않고, 즉 잠자기를 중단시키는 주요 방법)은 코드/디자인에 문제가 있음을 보여줍니다. – bestsss

+0

전적으로 동의합니다. 모니터링 대상과 중단 될 수 있는지 여부에 달려 있습니다. – JPelletier