Ordre d'exécution des threads dans l'ordre dans lequel ils ont été créés / démarrés
Comment puis-je commander fils dans l'ordre où ils ont été instancié.e.g. comment puis-je faire le programme ci-dessous imprimer les numéros 1...10 dans l'ordre.
public class ThreadOrdering {
public static void main(String[] args) {
class MyRunnable implements Runnable{
private final int threadnumber;
MyRunnable(int threadnumber){
this.threadnumber = threadnumber;
}
public void run() {
System.out.println(threadnumber);
}
}
for(int i=1; i<=10; i++){
new Thread(new MyRunnable(i)).start();
}
}
}
source d'informationauteur keshav84
Vous devez vous connecter pour publier un commentaire.
Sonne comme vous voulez
ExecutorService.invokeAll
qui sera de retour les résultats de threads de travail dans un ordre fixe, même si elles peuvent être programmées dans un ordre arbitraire:"J'ai fait quelques parties que je veux exécuter en parallèle, et puis une fois que les résultats sont générés, je veux fusionner les résultats dans un certain ordre." Merci, cela clarifie ce que vous demandez.
Vous pouvez les exécuter à la fois, mais la chose importante est d'obtenir leurs résultats dans l'ordre lorsque les threads terminer leur calcul. Soit
Thread#join()
dans l'ordre dans lequel vous souhaitez obtenir leurs résultats, ou simplementThread#join()
tous et puis itérer à travers eux pour obtenir leurs résultats.Tout simplement, l'ordonnancement de threads est de durée indéterminée.
Mort de domaine - ne cliquez pas surhttp://www.janeg.ca/scjp/threads/scheduling.html
WaybackMachine version de la page mentionnée ci-dessus
La plus longue réponse, c'est que si vous voulez faire cela, vous devez manuellement attendre pour chaque thread d'achever ses travaux avant d'autoriser l'autre à s'exécuter. Notez que dans ce mode, tous les threads encore interleave, mais ils ne seront pas faire le travail jusqu'à ce que vous donner le feu vert. Jetez un oeil à le synchroniser mot réservé.
Vous pouvez la chaîne d'eux – c'est le premier départ de la deuxième, la deuxième le troisième, etc. Ils ne seront pas vraiment être en cours d'exécution au même moment, sauf pour un peu de chevauchement lorsque chacun est commencé.
Ici un moyen de le faire sans avoir un maître thread qui attend chaque résultat. Au lieu de cela, avoir les threads de partager un objet qui ordonne les résultats.
Si vous avez besoin d'un contrôle précis, vous ne devez pas utiliser les threads, mais au lieu de le regarder en procédant à un Exécuteur testamentaire avec Callables ou Runnables. Voir les Exécuteurs testamentaires de la classe pour une large sélection.
Une solution simple serait d'utiliser un tableau
A
de serrures (un verrou par thread). Lorsque le threadi
commence ses exécutions, il acquiert ses associés de verrouillageA[i]
. Quand il est prêt à fusionner ses résultats, il libère sa serrureA[i]
et attend pour les serruresA[0], A[1], ..., A[i - 1]
être rejetée; puis il fusionne les résultats.(Dans ce contexte, le fil
i
signifie lai
-th lancé fil)Je ne sais pas ce que les classes à utiliser en Java, mais il doit être facile à mettre en œuvre. Vous pouvez commencer la lecture cette.
Si vous avez d'autres questions, n'hésitez pas à demander.
De contrôle de l'exécution du fil de commande peut être mis en place assez facilement avec les sémaphores. Le code ci-joint est basé sur les idées présentées dans Schildt livre sur Java (La référence complète....).
//Basé sur les idées présentées dans:
//Schildt H.: Java.L'.Complète.De référence.9.Edition.
Cela peut être fait sans l'aide de mot-clé synchronized et avec l'aide de volatils mot-clé. Voici le code.
Suivant est le lien github qui a un readme, qui donne des explications détaillées sur comment ça se passe.
https://github.com/sankar4git/volatile_thread_ordering