2012-09-25 3 views
0

시나리오가 있습니다. 뭔가 잘못 될 때까지 기다리고 싶습니다. 보통 20 초 정도 걸립니다.Java 사용 Thread.sleep() 또는 계속 묻습니다.

while(foo) { 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

아니면 그냥 이렇게 가야하나요?

while(foo) { 

} 
+0

foo를 토글하는 것은 무엇이든 할 수 있습니까? 가능한 경우 Wait/Notify가 합리적인 것처럼 보입니다. 설문 조사에 열심히 노력하십시오. Sleep()을 사용하면 대기 시간이 생기고 CPU/메모리 사이클이 낭비되며 Sleep()이 없으면 CPU/메모리 사이클이 낭비됩니다. 꽤 큰 총 대기 시간도 있습니다 (상자가 오버로드 된 경우 foo를 설정하는 스레드가 오랜 시간 실행되지 않을 수 있음). –

답변

8

바쁜 대기 20 초는 좋은 생각이 아닙니다. 5 초 동안자는 것은 5 초 동안 신호를 놓칠 수 있음을 의미합니다. 당신은 그런 CountdownLatch와 같은 다른 방법을 사용할 수 없습니다 : 두 번째 형태는 CPU 사이클을 많이 구울 것입니다

CountDownLatch latch = new CountDownLatch(1); 

//code that triggers the signal 
latch.countDown(); 

//code that waits for the signal 
try { 
    latch.await(); 
} catch (InterruptedException e) { 
    //handle interruption 
} 
+0

숫자 '1'은 무엇을 지정합니까? – Jaanus

+1

'latch.await()'는 카운트 다운이 0에 도달 할 때까지 대기합니다. 카운트 다운은 생성자에 전달 된 매개 변수에서 시작됩니다 (이 경우 : 1). 'latch.countdown()'을 호출 할 때마다 카운트 다운이 감소합니다. 예를 들어'latch = new CountDownLatch (2);라고 쓰면'latch.await()'가 다음 명령으로 진행하기 전에'latch.countDown() '을 두 번 호출해야합니다. – assylias

2

이것은 단위 테스트에 불과합니다. 첫 번째 예제를 사용합니다. 예쁘지 않아도됩니다.

프로덕션 코드 인 경우 조건 또는 미래와 같은 다른 구조를 사용하는 것이 좋습니다.

1

. 그것은 가능한 한 빨리, 어쩌면 초당 십만 번 확인합니다. 그건 좋은 생각이 아니다.

Thread.sleep()이 약간 낫습니다. foo이 비 휘발성 필드이고 여기가 synchronized 블록이 아닌 경우 여전히 여기에 또 다른 문제가 있습니다. 실제로 다른 스레드의 업데이트를 볼 수는 없습니다.

java.util.concurrent에있는 프리미티브를 CountDownLatch과 같이 사용하십시오.

0

확실히 두 번째 양식은 사용할 수 없습니다. 그것은 CPU를 괴롭 히고 문제를 일으킬 수 있습니다. 첫 번째 형태가 더 좋습니다.

값을 변경하려면 어떻게해야합니까?

단지 다른 스레드 인 경우 wait/notify 또는 동시성 구문을 사용하는 것을 고려할 수 있습니다.

0

더 이상 대기/알림을 좋아하는 사람이 없습니까? Sleep() 루프보다 더 간단하고 'CountDownLatch'보다 적은 타이핑 효과가 있습니다.,

+1

가짜 깨우기와 구별하기 위해 자신의 조건 변수를 작성하고 어떤 종류의 루프에서 확인해야합니다 (cf. http://stackoverflow.com/questions/1050592/do-spurious-wakeups-actually- 일어납니다.) CountDownLatch는 모든 것보다 쓰기가 적어지며, 플래그가 "volatile"이 아니거나 일부 메모리 장벽이 대기중인 스레드의 메모리에 신호를 복사하지 않도록 잘못 이해하지 않을 것임을 의미합니다. –

관련 문제