2010-12-21 4 views
2

루프를 그냥 포함시켜야합니까? run()을 구현하는 효율적이고 효율적인 방법은 무엇입니까?

while (true) { ... }

CPU를 너무 많이 소비하므로 효율적이지 않습니다. 내 스레드가 무언가를 기다리지 만 계속 CPU를 많이 소비하지 않고 기다리는 것이 가장 좋은 방법은 무엇입니까?

+1

()'. –

+0

관련 : http://stackoverflow.com/questions/1036754/difference-between-wait-and-sleep –

답변

6

효율적으로 (here 참조) Object.waitObject.notify를 사용하거나 차단 큐, 래치, 선물, 세마포어 또는 장벽 등 다양한 높은 수준의 자바 동시성 클래스를 사용하여이 작업을 수행하는 방법에는 여러 가지가 있습니다.

============================================== =====

당신은 반복 조건을 테스트하는 것은 정말 나쁜 생각이다 올바른지; 예 :

while (!condition) { 
     // really bad idea ... burns CPU cycles. 
    } 

다음

은 개선,하지만 여전히 문제가 될 수 있습니다 :

while (!condition) { 
     Thread.sleep(...); // bad idea 
    } 

문제는 당신이 잠 간격을 짧게 설정하면, 루프 비싼 얻을 수 있다는 것입니다. 그러나 좀 더 길게 (예 : 초 정도) 설정하면 상태가 true가되는 것에 응답하기 위해 스레드가 그 시간까지 소요될 수 있습니다. 그물 결과는 처리량 및/또는 부진한 사용자 인터페이스를 감소시킬 수 있습니다.

는 때때로 loop{test; sleep} 접근 방식은 불행하게도, 가능한 최상의 옵션입니다,하지만 당신이 그것을 피할 수 있다면, 당신은해야한다.

+0

좋은 포괄적 인 대답! +1 – fastcodejava

1

while(true) {}하지 마십시오. 어떤 이벤트가있을 때까지 기다리고 있다면 wait()-notify() 메커니즘을 사용하십시오. 그렇지 않은 경우 sleep(nsecs)을 사용하십시오. 당신이 Observer 패턴을 사용할 수 있습니다처럼

0

보다는 뭔가를 기다리고, 그것은 소리. Observer는 Observables라고 불리는 부양 가족 목록을 유지 관리하며, Observer 방법 중 하나를 호출하여 변경 사항을 알립니다. 여기

은 당신이 옵저버 클래스 및 관찰 가능한 클래스를 code 것이 방법입니다. 당신이 기다리고 싶지 않으면, 대기`사용

/** The Observer normally maintains a view on the data */ 
class MyView implements Observer { 
    /** For now, we just print the fact that we got notified. */ 
    public void update(Observable obs, Object x) { 
     System.out.println("update(" + obs + "," + x + ");"); 
    } 
} 

/** The Observable normally maintains the data */ 
class MyModel extends Observable { 
    public void changeSomething() { 
     // Notify observers of change 
     setChanged(); 
     notifyObservers(); 
    } 
} 
관련 문제