2 votes

Création d'un nombre de threads spécifié par l'utilisateur dans Android

Je fais une application de téléchargement pour Android. La partie téléchargement est maintenant implémentée avec succès et fonctionne. Ce dont j'ai besoin, c'est de télécharger le fichier en parallèle par segments. Pour être plus clair, si l'utilisateur spécifie 8 segments, je veux créer 8 threads et faire le téléchargement. De quelle manière pourrai-je créer 8 threads de manière dynamique ? De plus, comme je fais cela pour un téléphone, comment pourrai-je maintenir la consommation de mémoire à un niveau minimum ? Je n'ai jamais travaillé avec des threads auparavant, j'espère donc que vous pourrez m'aider. Merci pour votre temps ! :)

5voto

Tudor Points 39539

La manière la plus efficace de créer un nombre fixe de threads est d'utiliser la fonction ExecutorService :

ExecutorService exec = Executors.newFixedThreadPool(8);

Il s'agit essentiellement d'un pool de threads à taille fixe qui décharge le développeur d'une grande partie de la charge de gestion.

Modifier : Donc votre flux devrait être quelque chose comme ça :

Tout d'abord, définissez votre classe de tâches pour les threads (chaque thread exécutera le fichier call de sa propre tâche) :

class ThreadTask implements Callable<Object> {

    public Object call() {
        // execute download
        ...
        return result;
    }
}

Si vous voulez passer des paramètres aux tâches, mettez des champs privés dans la classe ci-dessus et passez-les par un constructeur. De plus, vous pouvez retourner n'importe quel type de call il suffit de modifier le type dans le champ implements Callable<...> partie.

Lorsque vous voulez lancer les threads, créez le pool et soumettez les tâches :

ExecutorService exec = Executors.newFixedThreadPool(8);
List<Future<Object>> results = new ArrayList<Future<Object>>();

// submit tasks
for(int i = 0; i < 8; i++) {
    results.add(exec.submit(new ThreadTask()));
}

...

// stop the pool from accepting new tasks
exec.shutdown();

// wait for results
for(Future<Object> result: results) {
    Object obj = result.get();
}

1voto

Keppil Points 28356

Jetez un coup d'œil à ExecutorService en particulier Executors.newFixedThreadPool(int i) Il s'agit d'un excellent moyen de gérer les threads de manière conviviale pour le système.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X