루프를 그냥 포함시켜야합니까? run()을 구현하는 효율적이고 효율적인 방법은 무엇입니까?
while (true) { ... }
CPU를 너무 많이 소비하므로 효율적이지 않습니다. 내 스레드가 무언가를 기다리지 만 계속 CPU를 많이 소비하지 않고 기다리는 것이 가장 좋은 방법은 무엇입니까?
루프를 그냥 포함시켜야합니까? run()을 구현하는 효율적이고 효율적인 방법은 무엇입니까?
while (true) { ... }
CPU를 너무 많이 소비하므로 효율적이지 않습니다. 내 스레드가 무언가를 기다리지 만 계속 CPU를 많이 소비하지 않고 기다리는 것이 가장 좋은 방법은 무엇입니까?
효율적으로 (here 참조) Object.wait
및 Object.notify
를 사용하거나 차단 큐, 래치, 선물, 세마포어 또는 장벽 등 다양한 높은 수준의 자바 동시성 클래스를 사용하여이 작업을 수행하는 방법에는 여러 가지가 있습니다.
============================================== =====
당신은 반복 조건을 테스트하는 것은 정말 나쁜 생각이다 올바른지; 예 :
while (!condition) {
// really bad idea ... burns CPU cycles.
}
다음
은 개선,하지만 여전히 문제가 될 수 있습니다 :while (!condition) {
Thread.sleep(...); // bad idea
}
문제는 당신이 잠 간격을 짧게 설정하면, 루프 비싼 얻을 수 있다는 것입니다. 그러나 좀 더 길게 (예 : 초 정도) 설정하면 상태가 true가되는 것에 응답하기 위해 스레드가 그 시간까지 소요될 수 있습니다. 그물 결과는 처리량 및/또는 부진한 사용자 인터페이스를 감소시킬 수 있습니다.
는 때때로loop{test; sleep}
접근 방식은 불행하게도, 가능한 최상의 옵션입니다,하지만 당신이 그것을 피할 수 있다면, 당신은해야한다.
좋은 포괄적 인 대답! +1 – fastcodejava
는 while(true) {}
하지 마십시오. 어떤 이벤트가있을 때까지 기다리고 있다면 wait()-notify()
메커니즘을 사용하십시오. 그렇지 않은 경우 sleep(nsecs)
을 사용하십시오. 당신이 Observer 패턴을 사용할 수 있습니다처럼
보다는 뭔가를 기다리고, 그것은 소리. 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();
}
}
()'. –
관련 : http://stackoverflow.com/questions/1036754/difference-between-wait-and-sleep –