2010-08-03 5 views
6

Lorsque mon application arrive à maturité, je trouve de plus en plus d'utilisations pour les threads. À présent, je dois avoir environ 25 discussions, toutes faisant des choses importantes et travaillant ensemble en symphonie.Les threads ajoutent-ils beaucoup de frais généraux à une application?

Je remarque cependant que mon application est installée autour de 15.5MB résident. Comparé au navigateur (+/- 35 Mo), je me sens plutôt en sécurité, mais je remarque que la taille de l'application de mon application ne cesse d'augmenter. La question est, combien de temps est impliqué avec l'ajout d'un fil?

Je me demande aussi si le mot-clé synchronized rencontre de plus en plus de latence avec chaque nouveau thread présent?

Merci!

+2

25 threads est beaucoup de threads pour une application mobile. Qu'est ce que ça fait? –

+2

Si vous posez cette question, il est probablement temps de repenser votre architecture. –

+0

Il est à noter que les threads dorment pendant 99% de leur durée de vie et ne se réveillent que pour effectuer du travail si nécessaire. @silico c'est une application bluetooth, effectuant des communications avancées avec les ordinateurs embarqués d'un véhicule. Connexions Bluetooth multiples, affichage à l'écran, ainsi que les tâches d'arrière-plan qui doivent se produire sur un calendrier. –

Répondre

2

Les fils sont très utiles mais en même temps ils peuvent être une menace. Je travaille sur un projet de vérification des menaces présentées par une application. Si vous exécutez top via le shell adb, il vous indique en particulier combien de threads une application peut être en cours d'exécution.

Vous verrez que l'utilisation du processeur est directement proportionnelle au nombre de threads. Cela signifie à peu près plus le nombre de threads plus élevé est le surcoût. Bien qu'ils semblent garder votre activité libre de rester coincé à temps, cela peut devenir une vraie douleur de synchroniser leurs actions et alors vous pouvez avoir une impasse, pas très jolie. De même, plusieurs no de threads suscitent des doutes sur le comportement d'une application. Par conséquent, ils devraient être utilisés dans l'esprit qu'ils sont destinés à être.

+0

Pensée intéressante: "plus de discussions ~ = activité sans scrupules" ... Toutes mes discussions sont sur le haut et le haut, mais je ' Prends ça en considération :) Merci pour le conseil adb, je ne me suis pas rendu compte que le top utilitaire affichait des threads! –

+4

Il n'y a rien de suspect du point de vue de la sécurité à propos d'une application qui a beaucoup de threads. – hackbod

+0

@hackbod vous avez peut-être raison, mais j'ai trouvé des discussions gênantes. Certaines applications dont les activités ne m'intéressent pas une fois que je quitte, parviennent à maintenir le processus en vie en utilisant des threads. Maintenant que j'appelle une activité suspecte1 – Shouvik

0

Un nombre incontrôlable de threads peut être un surcoût pour l'application. Votre application semble déjà avoir un nombre plus élevé de threads pour l'application mobile.

synchronisé implique une maintenance pour les verrous sur les objets.

Checkout si vous pouvez utiliser ThreadPoolExecutor. Cela aidera à limiter les threads dans le système, et réduira également les frais généraux de création et de destruction des threads.

2

Si vous créez et détruisez des threads encore et encore, alors oui, cela va entraîner des frais supplémentaires. Vous pouvez l'éliminer en utilisant ThreadPool, qui garde un cache de threads disponible pour l'exécution. Sinon, les threads sont le moyen de passer par dessus des processus.

Vous voudrez peut-être penser à des ajustements pratiques à l'architecture. Par exemple, si vous maintenez plusieurs threads en vie pour avoir une interface utilisateur responsive (en attendant une entrée) même si un thread particulier ne sera utilisé qu'après cinq sauts de menu, il n'est peut-être pas nécessaire de garder les threads en vie. le temps. J'ai rarement utilisé 15 threads distincts dans une seule application, même lorsque cette application exécutait une machine-outil massive ... (J'ai eu des threads de travail de répétition cependant). N'oubliez pas que les discussions doivent toujours être planifiées, alors ne les gardez pas inutilement. Enfin, assurez-vous que vous ne rencontrez pas les mêmes vieux problèmes avec le programme parallèle; évitez les interblocages, etc.

+0

Presque tous les threads sont créés une seule fois pour la durée de vie de l'application. Merci pour la note sur la machine-outil, qui permet de la mettre en perspective. Oui, j'ai utilisé tellement de choses afin de garder l'application très sensible à l'utilisateur. J'ai également constaté que les nombreuses couches d'application fonctionnent bien ensemble dans l'environnement multithread asynchrone. J'aime l'idée de threadPool, merci. –

3

Pour une perspective ici, une application Browser fraîchement lancée a environ 20 threads en cours d'exécution. Avoir 25 threads n'est pas complètement déraisonnable. Cela dépend vraiment de ce que vous faites avec eux.

app_1  17309 67 182452 27944 ffffffff 00000000 S com.android.browser 
app_1  17310 17309 182452 27944 ffffffff 00000000 S HeapWorker 
app_1  17311 17309 182452 27944 ffffffff 00000000 S Signal Catcher 
app_1  17312 17309 182452 27944 ffffffff 00000000 S JDWP 
app_1  17313 17309 182452 27944 ffffffff 00000000 S Compiler 
app_1  17314 17309 182452 27944 ffffffff 00000000 S Binder Thread # 
app_1  17315 17309 182452 27944 ffffffff 00000000 S Binder Thread # 
app_1  17317 17309 182452 27944 ffffffff 00000000 S CookieSyncManag 
app_1  17319 17309 182452 27944 ffffffff 00000000 S WebViewCoreThre 
app_1  17321 17309 182452 27944 ffffffff 00000000 S AsyncTask #1 
app_1  17322 17309 182452 27944 ffffffff 00000000 S AsyncTask #2 
app_1  17323 17309 182452 27944 ffffffff 00000000 S WebViewCoreThre 
app_1  17324 17309 182452 27944 ffffffff 00000000 S http0 
app_1  17325 17309 182452 27944 ffffffff 00000000 S http1 
app_1  17326 17309 182452 27944 ffffffff 00000000 S http2 
app_1  17327 17309 182452 27944 ffffffff 00000000 S http3 
app_1  17328 17309 182452 27944 ffffffff 00000000 S WebViewWorkerTh 
app_1  17329 17309 182452 27944 ffffffff 00000000 S AsyncTask #3 
app_1  17330 17309 182452 27944 ffffffff 00000000 S AsyncTask #4 
app_1  17332 17309 182452 27944 ffffffff 00000000 S AsyncTask #5 
Questions connexes