2017-09-27 9 views
0

일부 지점에서 서비스를 실행하는 Android 앱을 개발 중입니다. 이 서비스는 시간 소모적 인 작업을 위해 새 스레드를 실행하고 countDownLatch가 0이 될 때까지 대기합니다. 그 후에 또 다른 시간 소모적 인 작업을 위해 두 번째 스레드를 실행합니다 (새 스레드는 현재 필요하지 않지만 가까운 미래에있을 예정입니다).CountDownLatch.await() 백그라운드 스레드 일시 중지

지금 ... downloadThread를 시작한 후, 아래 그림과 같이 대기 상태가되면 메인 스레드와 downloadThread가 작업을 일시 중단합니다. 그러나, uploadThread 내부의 countDownLatch를 기다리는 것이 좋습니다.

Thread downloadThread = new Thread(new Runnable() { 
@Override 
public void run() { 
    downloadFiles(mMediaFileList); 
} 
}); 

downloadThread.start(); 

try { 
Log.d("UploadMedia", "Waiting for DownloadMedia to finish"); 
mCountDownLatch.await(); 
} catch (InterruptedException e) { 
e.printStackTrace(); 
} 

Thread uploadThread = new Thread(new Runnable() { 
@Override 
public void run() { 
    uploadMedia(); 
} 
}); 

uploadThread.start(); 

실제로 문제가 아니지만 두 가지 방법으로 모두 작동하지 않습니까? .await() 기능에 대해 놓친 부분이 있습니까?

건배!

편집 : 참고 : downloadFiles에는 작업 완료 또는 실패를 기다리는 콜백이 있습니다. 해당 콜백이 .await()에 의해 일시 중단되는 주 스레드에서 작동 할 수 있습니까?

답변

0

래치가 카운트 다운되는 위치가 분명하지 않습니다. 그러나 그것은 uploadMedia() 중에 발생합니다. 그렇다면, 메인 스레드는 latch.await()에서 멈추게됩니다. 그 이유는 래치를 0으로 계산할 수있는 다른 제어 흐름이 없기 때문입니다.

+0

입력 해 주셔서 감사합니다. 사실, 래치는 downloadMedia에서 카운트 다운됩니다. 래치가 0에 도달하면 모든 파일이 다운로드되었음을 의미합니다. uploadMedia는 사용 가능한 모든 파일을 잡고 업로드합니다. downloadFiles 내에서 콜백을 구현하는 메서드는 제 3 자 라이브러리에서 가져온 것입니다. 그래서 그 콜백이 어디로 "보내 졌는지"확실하지 않습니다. – Koopa