2017-09-27 3 views
0

Je travaille sur une application Android qui, à un moment donné, gère un service. Ce service exécute un nouveau thread pour une opération longue et attend un countDownLatch à zéro. Après cela, il exécute un deuxième thread pour une autre opération fastidieuse (ce nouveau thread n'est pas vraiment nécessaire maintenant, mais le sera dans un proche avenir).CountDownLatch.await() suspension des threads d'arrière-plan

Maintenant ... après le démarrage du downloadThread, si je fais l'attente comme indiqué ci-dessous, le thread principal ET le downloadThread suspendent les opérations. Cependant, si j'attends le countDownLatch dans le uploadThread, tout fonctionne correctement.

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(); 

Ce n'est pas vraiment un problème mais n'est-il pas supposé fonctionner dans les deux sens? Y a-t-il quelque chose qui me manque dans la fonctionnalité .await()?

À la votre!

Édition: Pour info, downloadFiles a des rappels qui attendent l'achèvement ou l'échec de la tâche. Se peut-il que ces callbacks fonctionnent sur le thread principal qui est suspendu par le .await()?

Répondre

0

Ce n'est pas évident où votre compte à rebours compte. Mais ça sonne comme ça se passe pendant uploadMedia(). Si c'est le cas, votre thread principal est obsolète à latch.await() car il n'y a aucun autre contrôle qui pourrait compter le verrou à zéro.

+0

Merci pour votre participation! En fait, le loquet est décompté dans downloadMedia. Lorsque le verrou atteint zéro, cela signifie que tous les fichiers ont été téléchargés. uploadMedia saisit simplement tous les fichiers disponibles et les télécharge. Les méthodes qui implémentent les callbacks à l'intérieur de downloadFiles proviennent d'une bibliothèque tierce ... c'est pourquoi je ne suis pas sûr de l'endroit où ces "callbacks" sont envoyés. – Koopa