76 votes

Quelle est la différence entre Thread.setPriority() et Android.os.Process.setThreadPriority() ?

Si j'ai un code comme :

Runnable r = ...;

Thread  thread = new Thread(r);
thread.setPriority((Thread.MAX_PRIORITY + Thread.NORM_PRIORITY) / 2);

ou ...

    Runnable r = ...
    Thread thread = new Thread( new Runnable() {
       public void run() {
         android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE);
         r.run();
       }
    });

IS la voie Android.os.Process requise/préférée ?

POURQUOI La voie Android.os.Process est-elle préférée/exigée si c'est le cas ?

Pour autant que je sache, cela n'est pas clairement documenté.

39voto

dronus Points 1925

L'implémentation Dalvik actuelle semble faire correspondre les threads Java un par un aux PTHREADs du système linux sous-jacent, comme vous le dites. Tous les threads de toutes les applications appartiennent au même groupe de threads du système, de sorte que chaque thread est en concurrence avec tous les threads de toutes les applications.

Donc actuellement Thread.setPriority devrait en fait faire la même chose que Process.setThreadPriority en utilisant la plus petite échelle de priorité de Java. Le mappage des priorités est défini dans kNiceValues à l'adresse vm/Thread.c

0 votes

Il semble donc que process.setthreadpriority soit préférable car il y a un groupe de priorités défini publiquement que dalvik utilise alors qu'avec thread.priority c'est une correspondance qui n'est pas publique. Cool.

2 votes

Je pensais juste qu'ils aboutissaient tous les deux aux mêmes appels d'api de l'OS, donc la seule différence est l'échelle de la valeur de priorité. Cela signifie que même Thread.setPriority fixe une valeur qui entre en concurrence avec les fils de l'application. Donc la décision pour l'une ou l'autre méthode est simplement une question de sécurité future, peut-être si les threads des applications sont regroupés une fois...

2 votes

Hey Dronus, Oui, ils appellent tous les deux le bon appel pthread. Cependant, en utilisant Thread.setPriority() vous utilisez une échelle de 0-10 et sur Process.setThreadPriority() vous utilisez l'échelle nice (+/- 20). Donc, oui, nice est plus granulaire mais Thread.MIN_PRIORITY, NORMAL et MAX PRIORITY ne sont pas aussi informatifs et sont quelque peu arbitraires quand la librairie OS fournie déclare des ensembles de priorités considérées comme attendues et saines. Qui sait ce que sera la correspondance entre l'échelle à 10 points à l'avenir. Rien ne dit qu'elle doit être linéaire.

8voto

Phileo99 Points 319

Google utilise

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

de Volley Répartiteur de réseau Je pense donc que l'utilisation de Process.setThreadPriority() est la meilleure solution.

10 votes

Downvoted parce que "google l'utilise" n'est pas une bonne réponse désolé. mise en œuvre des réponses comptables préféré

4 votes

Savez-vous qui écrit tout le code de Google ? Une bande de sorciers et de sorcières qui ne savent qu'écrire parfait code.

3 votes

Upvoted parce que c'est en fait une grand réponse. Pour ceux qui ne le savent pas, la bibliothèque Volley a toujours été un produit Google, officiellement publié par "The Android Open Source Project", documenté sur "developer.Android.com", et jusqu'en 2012 même dans le dépôt Android sous "frameworks/support". Bien que cette utilisation spécifique de l'API ait été introduite dans un commit non lié sans description ou explication spécifique (pendant la transition du dépôt) : github.com/google/volley/commit/

3voto

dronus Points 1925

Je m'appuierais sur thread.setPriority() . Le site android.os.Process.setThreadPriority nomme la priorité réelle des threads du système d'exploitation linux sous-jacent. Cependant, ceux-ci pourraient, mais n'ont pas besoin de correspondre aux threads Dalvik / Java VM, car la VM pourrait faire du threading par ses propres moyens ou utiliser les threads du système ou une combinaison des deux. Augmenter la priorité du système aurait plus probablement pour résultat de donner la priorité à votre application en faveur des autres, si elle n'est pas limitée par les contraintes de sécurité d'Android, mais ne garantit pas la priorité de votre thread Java actuel en faveur des autres threads Java de votre application.

1 votes

Je n'en suis pas sûr. Même sur une machine Unix moderne, la machine virtuelle Java utilise le modèle de thread natif. J'ai regardé un peu l'implémentation de Process.setThreadPriority et oui, il définit la priorité du thread natif directement dans linux. Cependant, il semble qu'il s'agisse d'une approche plus granulaire puisque Thread.MAX_PRIORITY - Thread.MIN_PRIORITY ne représente qu'une distance de ~10. Créer un modèle de threads qui s'imbrique dans les systèmes d'exploitation semble plutôt encombrant et peu avantageux pour un appareil embarqué. Je dois penser qu'il y a plus que ce que vous suggérez.

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