2011-04-29 2 views
8

공유 리소스에 대한 액세스를 동기화/대기열로 만들기 위해 대기 루프를 사용하여 Semaphore을 사용하려고합니다.SystemClock.sleep()과 Semaphore 루프를 기다리는 동안 Thread.sleep()

CPU 페깅을하지 않으려면 조금 안에 그 while 루프를 넣고 싶습니다.

은 내가 http://developer.android.com 참조를 검색하고이 개 수면을 발견() 함수와 내가 맞는에 어느 혼동하고있는 시나리오 :

  1. Thread.sleep()
  2. SystemClock.sleep()

하나 개 더 정장 내가 설명한 경우와 그 이유는 무엇입니까?

+0

'SystemClock.sleep()'은 UI 스레드에서 실행된다고 생각합니다. –

답변

18

우선 대기 루프가 필요합니까? 일반적으로 Object (예 : Object)를 사용하여 wait() 및 notify()를 호출하거나 다른 방법 (예 : 차단 대기열 또는 사례의 Semaphore.acquire)과 같은 적절한 알림을 사용하여 문제를 해결할 수 있습니다.

그런데 폴링 루프 (실제로는하지 않으면 안되는) 폴링 루프를 원한다면 Thread.sleep()을 고수 할 것입니다. 설명서에는 Thread.sleep()을 인터럽트 할 수 있다는 점을 제외하면 차이점이별로 없습니다. 그렇게 할 수있는 옵션을 없애지 마십시오.

Thread.sleep()의 경우에는 예외를 잡아야 할 것입니다. 매우 게으른 경우 SystemClock.sleep()을 사용하는 것이 좋습니다.

+0

위대하고시의 적절한 설명에 감사드립니다. 나는'Semaphore.acquire()'가 최선의 선택 일 수 있다는 것을 발견했다. – srf

+0

wait()를 사용하는 경우 반복해야합니다. wait()는 notify() 호출 전에 리턴 할 수 있습니다. http://docs.oracle을 참조하십시오.올바른 사용법은 com/javase/7/docs/api/java/lang/Object.html # wait()를 참조하십시오. "7 주 연속 실행 모델 7 개 : 스레드가 풀릴 때"에서는이 주제를 잘 설명합니다. – Jonathan

0

진실은 :

에 Thread.sleep (N) (참) asyncTask.cancel를 사용하여 AsyncTask를 같은 호출 내에서 중단 될 수

SystemClock.sleep (n)은 어떤 중단 명령을 무시하는 것 따라서 다음과 같이 비슷한 메모리 누수가 발생할 수 있습니다. https://github.com/square/leakcanary/blob/master/leakcanary-sample/src/main/java/com/example/leakcanary/MainActivity.java

+0

그들은 관련이 없습니다. 이 예에서는 화면을 회전시킬 시간을주기 위해 잠을 사용하기 때문에 누출이 발생합니다. –

2

Thread.sleep()은 java에서 제공되는 기능입니다. InterruptedException이이 함수를 호출하는 동안 발생할 수 있습니다.

SystemClock.sleep()은 android에서 제공하는 기능입니다. 이 함수를 호출하는 동안 InterruptedException이 발생하지 않으며 인터럽트 이벤트는 다음 인터럽트 이벤트까지 지연됩니다.

SystemClock.sleep (밀리 초)에 Thread.sleep (밀리 초) 매우 유사한 효용 함수이지만 InterruptedException 무시한다. Thread.interrupt()을 사용하지 않으면 지연을 위해이 함수를 사용하십시오. 스레드의 인터럽트 된 상태를 유지하기 때문입니다.

결론 : 결론 : 안드로이드 응용 프로그램을 갖고 싶다면 SystemClock.sleep (millis)을 사용하십시오.

관련 문제