28 votes

Donner la priorité aux threads de Java

J'ai un programme qui s'exécute dans plusieurs threads. Le thread principal partage un objet avec les autres threads et dans le thread principal, j'ai un appel à :

synchronized(obj){
    do stuff
}

J'ai l'impression que le fil d'Ariane principal est privé de ressources et n'a pas accès à la fonction obj . Comment puis-je augmenter la priorité du thread principal ou est-elle déjà plus élevée que les autres threads par défaut ?

46voto

Macarse Points 36519

Vous disposez d'une méthode setPriority() dans la classe Thread.

Vérifier cette javadoc .

Réglage de la priorité des threads au maximum :

public static void main(String args[]) {
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    // Your main code.
}

9voto

djna Points 34761

La série d'articles aquí indiquent certaines complexités dans la gestion des priorités des threads sur les différentes plateformes.

Je me demande si votre problème fondamental n'est pas simplement que vos threads de travail sont très intensifs en termes de CPU et n'atteignent donc que rarement un point où ils "lâcheraient" naturellement le processeur (par exemple en faisant quelques IO ou en dormant.) Si c'est le cas, vous pourriez inclure quelques appels à yield() dans ces threads de travail, donnant ainsi plus de chance aux autres threads.

6voto

northpole Points 5793

Vous pouvez utiliser la méthode setPriority(). Par exemple, vous pouvez utiliser la méthode

new MyThread("Foo").start(); 
Thread bar = new MyThread("Bar"); 
bar.setPriority( Thread.NORM_PRIORITY + 1 ); 
bar.start();

Cela donne à la barre la nouvelle priorité qui devrait rapidement prendre le dessus sur Foo.

Editer :

Pour répondre à votre commentaire, vous pouvez définir la priorité maximale en utilisant :

bar.setPriority( Thread.MAX_PRIORITY );

3voto

user3427024 Points 11

Augmenter la priorité du thread principal de la manière suivante Macarse dit que cela fonctionnera probablement. Cependant, vous comptez sur le planificateur de threads préemptifs de la plateforme pour fonctionner correctement. Vous devriez plutôt appeler la fonction Thread.yield() dans vos threads de travail lorsqu'ils ont terminé les sections importantes du code qu'ils exécutent. C'est une bonne habitude à prendre, même si vous utilisez différents niveaux de priorité des threads.

1voto

Sigi Points 59

Comme d'autres l'ont déjà fait, vous pouvez en effet donner une priorité à un fil de discussion de la manière suivante :

Thread.currentThread().setPriority(priority);

Mais sachez que, dans votre exemple, la priorité des threads n'a rien à voir avec l'ordre dans lequel les threads accèdent à un objet synchronisé. Java utilise d'autres critères pour accorder l'accès. Voir par exemple este .

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