2011-04-11 5 views
0

별도의 스레드 (네트워크 스레드라고 함)에서 일련의 네트워크 작업을 실행하는 데 사용하는 LinkedBlockingQueue가있는 Android 애플리케이션이 있습니다. 네트워크 작업에서 특정 응답을 받으면 대화 상자에서 사용자 입력 작업을 일시 중지해야합니다. 사용자 입력이 완료 될 때까지 네트워크 스레드를 차단하고 차단을 해제하여 네트워크 작업을 계속 처리 할 수 ​​있습니다. 어떤 동시성 메커니즘이 가장 효과적입니까?소비자 큐 스레드를 일시 중지하는 데 사용해야하는 동기화 방법은 무엇입니까?

편집 : 일시 중지가 네트워크 작업의 결과를 바탕으로 수행되기 때문에, 일시 정지 이벤트가 네트워크 스레드에서 제공 ,

답변

1

편집 : 귀하의 편집 해상도가 조금 쉬워집니다. 당신은 여전히 ​​시그널링을 필요로 할 것입니다. 그러나 당신은 복잡한 난장판을 긁을 수 있습니다. 간단한 ReentrantLock과 플래그를 사용할 수 있습니다.

아마이

boolean needsToWaitForUserInput = false; 
final ReentrantLock lock = new ReentrantLock(); 
final Condition waitingCondition = lock.newCondition(); 

private final Runnable networkRunnable=new Runnable(){ 
    public void run(){ 
     //get network information 
     lock.lock(); 
     needsToWaitForUserInput = true; 
     try{  
     while(needsToWaitForUserInput){ 
      waitingCondition.await(); 
     } 
     }finally{ 
      lock.unlock(); 
     } 
    } 
} 
    public void signalJobToContinue(){ 
     lock.lock(); 
     try{  
      needsToWaitForUserInput =false; 
      waitingCondition.signal(); 
     }finally{ 
     lock.unlock(); 
     } 

} 
+0

같은 편집을 참조하십시오 : 네트워크 스레드 자체가 일시 정지해야 할 때 알고있는 것입니다. –

+0

해당 편집을 기반으로 Ok가 업데이트되었습니다. 그 질문이 아직도 오해되고 있는지 알려주세요. –

관련 문제