web-dev-qa-db-fra.com

Définition de la priorité sur les threads de Java

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

synchronized(obj){
    do stuff
}

Je soupçonne que le thread principal est affamé et n'a pas accès à obj. Comment puis-je augmenter la priorité du thread principal ou est-il déjà plus élevé que les autres threads par défaut?

27
Guy

Vous avez une méthode setPriority () dans la classe Thread.

Vérifiez ce javadoc .

Définition de la priorité des threads au maximum:

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

La série d'articles ici indique quelques complexités dans la gestion des priorités des threads sur différentes plateformes.

Je me demande si votre problème fondamental est simplement que vos threads de travail sont très gourmands en CPU et atteignent donc rarement un point où ils "relâcheraient" naturellement le processeur (par exemple en faisant quelques IO ou endormi.) Si tel est le cas, vous pouvez inclure des appels à yield () dans ces travailleurs, donnant ainsi plus de chance aux autres threads.

9
djna

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

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

Cela donne à bar la nouvelle priorité qui devrait rapidement prendre le pas sur Foo

Éditer:

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

bar.setPriority( Thread.MAX_PRIORITY );
5
northpole

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

3
Lorek

Comme d'autres l'ont déjà répondu, vous pouvez en effet définir une priorité sur un thread comme suit:

Thread.currentThread().setPriority(priority);

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

1
Sigi