2017-09-27 102 views
0

我正在开发一个在某些时候运行服务的android应用程序。该服务运行一个耗时的操作的新线程,并等待countDownLatch为零。之后,它会运行另一个线程进行另一个耗时的操作(该新线程现在不是真的必要,但将在不久的将来)。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

感谢您的输入!实际上,latch会在downloadMedia中倒数。当锁存器达到零时,意味着所有的文件都被下载了。 uploadMedia只抓取所有可用的文件并上传它们。在downloadFiles中实现回调的方法来自第三方库...这就是为什么我不确定这些回调被“发送”到哪里。 – Koopa