Execution de tâches parallèles
bloomingdals
Messages postés
74
Date d'inscription
Statut
Membre
Dernière intervention
-
bloomingdals Messages postés 74 Date d'inscription Statut Membre Dernière intervention -
bloomingdals Messages postés 74 Date d'inscription Statut Membre Dernière intervention -
Bonsoir,
voila mon probleme: j'ai une classe qui herite de thread que je voudrai l'instancier plusieures fois dans une autres classes. je veux que ces instances s'exécutent en parallèles.
j'ai trouvé sur google un très bon exemple pour ce genre de chose, j'ai testé le code et ca fonctionne, aucun problem. mais quand j'essaie d'écéuter ce même code avec mes taches à moi c'est à dire les instannces dont je vous ait parlé, ca ne marche pas , l'exécution se fait de manière séquentielle et non simultanée. je ne sais pas si le problem vient du fait que le temps d'exécution de chaque instance est trop long ou c'est parce que j'ai une erreur de codage
svp aidez moi
voila mon probleme: j'ai une classe qui herite de thread que je voudrai l'instancier plusieures fois dans une autres classes. je veux que ces instances s'exécutent en parallèles.
j'ai trouvé sur google un très bon exemple pour ce genre de chose, j'ai testé le code et ca fonctionne, aucun problem. mais quand j'essaie d'écéuter ce même code avec mes taches à moi c'est à dire les instannces dont je vous ait parlé, ca ne marche pas , l'exécution se fait de manière séquentielle et non simultanée. je ne sais pas si le problem vient du fait que le temps d'exécution de chaque instance est trop long ou c'est parce que j'ai une erreur de codage
svp aidez moi
A voir également:
- Execution de tâches parallèles
- Windows 11 barre des taches a gauche - Guide
- Barre des taches - Guide
- Gestionnaire des taches windows 11 - Guide
- Changer la couleur de la barre des taches - Guide
- Gestionnaire des taches - Guide
6 réponses
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().
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
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à.
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!!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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")); } }