Question

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

synchronized(obj){
    do stuff
}

Je soupçonne que le thread principal est affamé et qu'il 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?

Était-ce utile?

La solution

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

Vérifiez ce javadoc .

Définition de la priorité de thread au maximum:

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

Autres conseils

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

Je me demande si votre problème fondamental réside simplement dans le fait que vos threads de production utilisent beaucoup de temps processeur et atteignent donc rarement un point où ils seraient naturellement "lâchés" et "laissés aller". du processeur (par exemple en faisant des entrées-sorties ou en dormant.) Si tel est le cas, vous pouvez inclure certains appels à yield () dans ces travailleurs, ce qui donne plus de chances à d'autres threads.

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();

Ceci donne la nouvelle priorité qui devrait rapidement prendre le contrôle de Foo

Modifier:

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

bar.setPriority( Thread.MAX_PRIORITY );

Augmenter la priorité du thread principal Macarse dit que cela fonctionnera probablement. Cependant, vous comptez sur le planificateur de threads préemptif de la plate-forme pour fonctionner correctement. Vous devriez plutôt appeler la méthode statique Thread.yield () dans vos threads de travail lorsque ceux-ci sont terminés avec les sections de code importantes qu'ils exécutent. C’est une bonne habitude à prendre même lorsque vous utilisez différents niveaux de priorité de thread.

Comme d'autres personnes ont déjà répondu, vous pouvez en effet définir une priorité pour un fil comme suit:

Thread.currentThread().setPriority(priority);

Sachez cependant que, dans votre exemple, la priorité des threads n’a rien à voir avec 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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top