Execution de tâches parallèles
Fermé
bloomingdals
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
-
Modifié par bloomingdals le 11/04/2013 à 17:27
bloomingdals Messages postés 74 Date d'inscription mercredi 20 février 2013 Statut Membre Dernière intervention 6 août 2013 - 16 avril 2013 à 12:28
bloomingdals Messages postés 74 Date d'inscription mercredi 20 février 2013 Statut Membre Dernière intervention 6 août 2013 - 16 avril 2013 à 12:28
A voir également:
- Execution de tâches parallèles
- Windows 11 barre des taches a gauche - Guide
- Gestionnaire de taches - Guide
- Barre des taches - Guide
- Changer la couleur de la barre des taches - Guide
- Barre des taches windows 11 - Guide
6 réponses
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
11 avril 2013 à 19:21
11 avril 2013 à 19:21
La méthode à redéfinir pour dire quoi faire pendant le thread c'est run(), mais c'est la méthode start() qui permet de créer le parallélisme. Si tu appelles run() tout seul le traitement se fera correctement mais en séquentiel...
Si tes threads s'exécutent en séquentiel c'est donc surement parce que tu appelles la méthode run() au lieu de la méthode start().
Si tes threads s'exécutent en séquentiel c'est donc surement parce que tu appelles la méthode run() au lieu de la méthode start().
bloomingdals
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
2
12 avril 2013 à 09:46
12 avril 2013 à 09:46
non pas du tout j'appel la methode start pour chacune des instances mais étant donné que le traitement de chaque instances est un peu long on a l'impression que chaque instance monopolise la JVM.
je crois qu'il faut rajouter la methode sleep ou wait dans le code de ma classe à instancier mais je sais pas où exactement je dois la mettre de sorte a donner la chance aux autres instances d'êtres exécutée aussi
je crois qu'il faut rajouter la methode sleep ou wait dans le code de ma classe à instancier mais je sais pas où exactement je dois la mettre de sorte a donner la chance aux autres instances d'êtres exécutée aussi
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
12 avril 2013 à 18:23
12 avril 2013 à 18:23
Non, il n'y a rien à faire, la JVM se charge toute seule d'ordonancer les threads et de leur donner la main chacun à leur tour. Tu peux éventuellement modifier les priorités de tes threads pour qu'il y en ai un qui soit appelé d'abord s'il est prêt, mais les sleep ne doivent pas servir dans ces cas là.
bloomingdals
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
2
15 avril 2013 à 13:43
15 avril 2013 à 13:43
rebonjour,
au fait j'ai un aute probleme. je peux exécuter maintenant plusieurs thread de manière parallèles (l'ordre est aléatoire). chacun de ces thread retourne un fichiers qui contient une ligne.
à la suite j'ai une instrunction java qui prend tous ces fichiers et les concatène. le probleme est que je suis obligé de faire un sleep (1500) pour que les fichiers soient prêt pour cette concaténation (sinon je risque de qu'il soit encore vide).
comment réaliser ca sans utiliser sleep (car le timer peut changer je ne peux le postitionner a 1500 ms pour toujours)??? j'ai essayé avec wait/ notify mais le notify ne fonctionne pas mon thread ne se reveille pas!!!
au fait j'ai un aute probleme. je peux exécuter maintenant plusieurs thread de manière parallèles (l'ordre est aléatoire). chacun de ces thread retourne un fichiers qui contient une ligne.
à la suite j'ai une instrunction java qui prend tous ces fichiers et les concatène. le probleme est que je suis obligé de faire un sleep (1500) pour que les fichiers soient prêt pour cette concaténation (sinon je risque de qu'il soit encore vide).
comment réaliser ca sans utiliser sleep (car le timer peut changer je ne peux le postitionner a 1500 ms pour toujours)??? j'ai essayé avec wait/ notify mais le notify ne fonctionne pas mon thread ne se reveille pas!!!
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
15 avril 2013 à 18:19
15 avril 2013 à 18:19
Tu devrais utiliser join() pour attendre que les threads se terminent.
Exemple :
Exemple :
Thread[] tab = ... // Démarrage de tous les threads d'un tableau for (Thread t : tab) t.start(); // Attente de la fin de tous les threads for (Thread t : tab) t.join();
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
bloomingdals
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
2
15 avril 2013 à 19:03
15 avril 2013 à 19:03
merci bcp j'essairai avec ca et je t'informerai
bloomingdals
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
2
16 avril 2013 à 12:28
16 avril 2013 à 12:28
bonjour au fait j'ai arrangé un peu mon code et j'ai utilisé la methode join () dont tu m'a parlée. je l'ai mise après le thread quil DOIT être fini pour lancer la suite du programme mais ca ne marche toujours pas.
je te met le code il est commenté stp jette un coup d'oeil et dis moi comment je peux régler mon probleme
merci
je te met le code il est commenté stp jette un coup d'oeil et dis moi comment je peux régler mon probleme
merci
public class Bgp_Peers extends Thread{ static TargetRouter target; Vector <String> oids; Vector <String> files; File targetFile; String state_s; public Bgp_Peers (TargetRouter target) throws IOException, Exception { this.target=target; this.oids=loadOids(); this.files=loadFiles(); this.targetFile=new File("/var/lib/mysql/"+this.target.getDataBase()+"/Bgp_Peers"); this.start(); } // @Override public synchronized void run() { // définir le rep d'exécution des requêtes Shell final Shell sh = new Shell(); File dir= new File("/root/Desktop/Bgp_Peers"); if (dir.exists()==false) { dir.mkdir(); } sh.setDirectory(dir); String cmd0="cd /root/Desktop/Bgp_Peers"; try { sh.command(cmd0).consume();} catch (IOException ex) {Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex); } // lancer les Threads (voir la class ExcecuteSnmp) ExecuteSnmp s=new ExecuteSnmp(this, oids, files, sh); s.start(); try { s.join(); // je fais le join } catch (InterruptedException ex) { Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex); } ConcatFile c=new ConcatFile(this, sh); // je veux que le thread ConcatFile ne soit lancé que si ExecuteSnmp soit terminé c.start(); } public Vector <String> loadOids() { Vector oids = new Vector(); oids.add(".1.3.6.1.2.1.15.3.1.1"); oids.add(".1.3.6.1.2.1.15.3.1.2"); oids.add(".1.3.6.1.2.1.15.3.1.3"); oids.add(".1.3.6.1.2.1.15.3.1.9"); oids.add(".1.3.6.1.2.1.15.3.1.10"); oids.add(".1.3.6.1.2.1.15.3.1.11"); return(oids); } public Vector<String> loadFiles() { Vector files=new Vector(); files.add("peerAddr"); files.add("peerState"); files.add("peerStatus"); files.add("peerRemoteAS"); files.add("peerInUpdates"); files.add("peerOutUpdates"); return(files); } class walk extends Thread // Défini les Thread { String routerIP; String community; String oid; String file; Shell sh; public walk(Bgp_Peers b, String oid, String file, Shell sh) { this.routerIP=b.target.getRouterAddr(); this.community=b.target.getCommunity(); this.oid=oid; this.file=file; this.sh=sh; } public void run() { String cmd="snmpwalk -Ovq -v2c -c "+target.getCommunity()+" "+target.getRouterAddr()+" "+oid+ "> "+file+ "";try { sh.command(cmd).consume(); } catch (IOException ex) { Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex); } } } class ExecuteSnmp extends Thread // lance une multitude de thread de la class walk { Bgp_Peers b; Shell sh; public ExecuteSnmp(Bgp_Peers b, Vector<String> oids, Vector<String> files, Shell sh) { this.b=b; this.sh=sh; } public void run() { int i; for (i=0; i<=5;i++) { new walk(this.b, oids.elementAt(i), files.elementAt(i), this.sh).start(); } } } class ConcatFile extends Thread { Bgp_Peers b; File targetFile; Shell sh; public ConcatFile(Bgp_Peers b, Shell sh) { this.b=b; this.targetFile=b.targetFile; this.sh=sh; } public void run() { // concaténer les fichiers String cmd1="paste -d ':' 'peerAddr' 'peerState' 'peerStatus' 'peerRemoteAS' 'peerInUpdates' 'peerOutUpdates' > "+targetFile.getPath()+""; try { sh.command(cmd1).consume(); } catch (IOException ex) { Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex); } } } public static void main(String[] args) throws IOException, Exception { Bgp_Peers b=new Bgp_Peers(new TargetRouter("10.16.1.29", "Divona", "OrangeTunisie")); } }