2012-02-23 2 views
16

항상 처리 지연 또는 비슷한 것을 생성하기 위해 Thread.Sleep()을 사용하는 사람들을 보았습니다. 사람들은 항상 이런 식으로 사용하는 것을 비웃었습니다.언제 Thread.Sleep()을 사용하는 것이 현명합니까?

언제 Thread.Sleep()을 사용하는 것이 바람직합니까?

+0

왜 사람들은 왜이 질문에 투표하지 않았습니까? – ediblecode

+0

-1 하나의 언어를 선택하십시오. 이 질문에 대한 답은 다른 도서관을 참조 할 것입니다. 이 질문에 동시에 두 가지 다른 언어를 묻는 것은 혼란 스럽습니다. –

+1

@ErickRobertson 그래서 두 가지 질문을 만들어야한다고 말하고 있습니까? 나에게 중요하지 않은 것 같아. – ediblecode

답변

22

실제로 백그라운드 스레드에서 지연이 필요할 때 Thread.sleep()으로 전화해야합니다.

동기화를 돕기 위해 호출하지 말고, 뭔가 기다리기 위해 루프에서 호출하지 마십시오 (속도가 느림) UI 스레드에서 절대로 호출하지 마십시오 (동결됩니다.)).

+10

그냥 추가 : 그리고 Thread.Sleep 중 하나를 사용하여 정확한 타이머를 만들지 마십시오. –

+0

파일이나 네트워크 소켓에 대해 긴 처리를 수행하는 동안 백그라운드 스레드에서'Thread.Sleep'을 사용합니다 (스레드가 완료되면 콜백을합니다). 이것은'Thread.Sleep'을 위해 좋은 사용인가요 아니면 이것을하기위한 더 나은 마카니즘인가요? – Matthew

+0

@Matthew 한 스레드의 작업을 수행하는 데 두 개의 스레드를 사용하는 것처럼 들리네. 수면 스레드는 주기적으로 일어나서 작업자 스레드가 여전히 작동하는지 확인하는 것 외에는 아무 것도하지 않습니까? 완료되면 작업자 스레드가 콜백 자체를 호출 할 수 없습니까? –

-2

스레드가 무언가를하지 못하도록하고 싶다면 무한 루프를 만들 때 가끔 루프가 멈추지 않아야합니다. CPU 파워가 많이 걸리므로 thread.sleep을 추가해야합니다. 루프를 "휴식을 취하고"cpu에게 약간의 휴식을 줄 것입니다 ^^.

+0

그런 프로그램을하려고한다면, 타이머를 사용합니까? – ediblecode

+1

sleep() 호출을 대체하기 위해 타이머를 사용하는 방법 타사 스크립트 인터프리터 'OnProcessLine'이벤트에 있다고 가정하고, 다른 스크립트를 실행하는 여러 스레드 중 하나의 스택에 알 수없는 깊이가 있다고 가정합니다 타이머를 사용하여 어떻게해야합니까? –

0

이 매개 변수는 컨텍스트 전환 (매개 변수 1)을 강제하거나 다른 상위 우선 순위 스레드 (매개 변수 0)를 사용하는 데 사용될 수 있지만 .... 거의 필요하지 않습니다.

5

일부 폐품이나 테스트 코드에서 멈춤을 도입해야 할 때 Thread.Sleep()이 좋습니다.

프로덕션 코드에서는 다른 옵션을 찾아 보는 것이 가장 좋습니다. 예를 들어 일정한 기간에 무언가를하려한다면 많은 기존 타이머 클래스 중 하나를 사용하십시오. 입력 대기열이 비었을 때 (그리고 .NET에서) 일시 중지하려는 경우 Monitor.Wait()Monitor.Pulse()을 대신 사용해보십시오. 이 문서의 수면의 단점()의

더 (다시, .NET 중심) 설명 : Thread.Sleep is a sign of a poorly designed program.

+1

+1 비 생산 코드 사용이 많으며 다중 스레드 프레임 워크 개발/데모시 장기 실행 작업을 시연하는 것이 유용합니다. 실제 작업을하기위한 자리에 서기 만하면됩니다. – Servy

+0

이전에 링크 된 기사를 읽었습니다. 방금 다시 읽었습니다. 좋지 않았습니다. 두 번째로 더 나빴습니다. –

3

테스트 코드를 작성. 어떤 함수가 여러 스레드에서 무작위로 호출되는 것을 처리하는 방법을보고 싶다면.

또한 테스트를 위해 지연을 시뮬레이트하려는 경우. 진행률 표시 줄을 테스트하고 싶다고합시다.

3

내가 받아 들일 만하다고 생각하는 경우는 거의 없습니다. 궁극적으로 그것은 내 마음 속의 다음과 같은 상황에 이른다. 다른 사람들은 이것들이 적용되지 않는 경우에 소리내어 들일 수도 있지만, 경험적으로 볼 때, 아래의 것들 모두가 실재로 Thread.Sleep을 사용해야한다.) 일명 사소한 또는 테스트하지 코드 :

  1. 당신은 자원에 대기중인
  2. )
  3. 당신은 다른 자원을 수정할 수 없습니다를 준비 (A WaitHandle이 또는 무언가의 적절한 사전 통지를 제공하지 않는 문제의 자원 질문을 던지십시오.
  4. SpinWait이 정당화되지 않을만큼 오래 기다릴 필요가 있다는 것을 알고 계셨습니다. d 컨텍스트를 벗어나면 성능이 향상됩니다.
0

Thread.Sleep이 필요한 경우 잘못된 디자인 일 수 있습니다. AutoResetEvent 또는 ManualResetEvent와 같은 동기화 메커니즘을 사용하고 이벤트가 발생할 때까지 기다립니다. 나는 종종 폴링을 Thread.Sleep으로 만들었지 만 가능한 경우 이벤트를 사용하는 것이 좋습니다.

+1

이 답변은 질문에 대한 대답이 없습니다. – ediblecode

+0

나는 Thread.Sleep을 사용해서는 안되며 이벤트 메커니즘을 더 잘 사용한다고 말하고 싶다. 그게 네 질문에 대한 내 대답이 아닐지도 모르겠다. – BlueM

+0

http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx의 위 응답에 언급 된 것과 같습니다. 참으로 나쁜 디자인의 징표입니다. ".NET에는 다른 이유가 없습니다." – BlueM

0

일반적으로 효과적인 (또는 오히려 효과가없는) 멀티 스레딩 디자인과 관련된 수면 사용에 대한 불만.멀티 스레딩은 큰 주제이며, 나는 당신에게 좋은 책을 소개 할 것이다. (Java Concurrency in Practice in Goetz).

고정 된 시간 동안 처리 코드를 지연 시키려면 sleep()을 사용하는 것이 좋습니다 (단, Timer 클래스는 정기적 인 동작을 구현하는 좋은 방법입니다).

+0

타이머를 사용하면 개발자가 절차 사양을 구현하는 상태 시스템을 개발해야합니다. 연산이 더 단순한 단계의 시퀀스에 의해 정의되고, 종종 긴 간격으로 분리되면, 함수 호출과 sleep() 호출이 직접 매핑됩니다. 비동기 상태 머신은 그렇지 않습니다. –

+0

'효과적인 (또는 오히려 효과가없는) 멀티 스레딩 디자인과 관련된 수면 사용에 관한 불만.' 이것은 매우 사실이지만, 슬프게도, 이것은 몇몇 사람들의 생각에서 '수면 (sleep)은 반 패턴이다'라고 해석한다. '매년 소방서, 구급차, 경찰 순양함은 수백 개의 교통 사고를 일으 킵니다. 따라서 그들은 모두 금지되어야합니다. –

-1

작업이 오래 걸릴 때마다 사용하십시오. 사양에 '계속하기 전에 최소 10 초 기다려주십시오.'라고 표시되면 절전 (10000)을 호출하십시오. 대안이 있습니다. 코드를 상태 엔진으로 다시 작성하여 타이머 이벤트가 발생할 때까지 컨트롤을 항복 할 수 있습니다. 테이블 구동 상태 머신은 매우 유연하며 완전히 비동기 작동을 허용합니다. 그 결과 '코드'는 어떤 식 으로든 요구 사양을 닮지는 않을 것입니다. 디버깅하기가 어렵고, 수정하고, 유지하고 및/또는 강화하는 악몽이 무엇인지 이해하는 것은 거의 불가능합니다. 그러나 당신은 그 불쾌한 것을 피할 수 있습니다 , 안티 패턴 'Sleep (10000)'통화.

다른 사람이 게시 했으므로 스레드 간 통신에는 사용하지 마십시오! 모든 멀티 태스킹 OS에는 더 효과적인 sychro 메커니즘이 많이 있습니다.

관련 문제