IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

Process et Thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    Par défaut Process et Thread
    Bonjour, en revoyant les threads, j'ai examiné le tuto suivant

    http://ydisanto.developpez.com/tutor.../runtime-exec/

    J'ai essayé de le tester mais process dans les 2 new Thread() pose problème

    Eclipse me signale une erreur à 2 endroits --> process en rouge ds code, quelque chose m'échappe ...

    Voici le code , MERCI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    package thread;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class CopyOfCl_Process_developpez {
    
    	public static void main(String[] args) {
    		// lancement de la commande
    		 Runtime rt = Runtime.getRuntime();
    		 
    		 try {
    			 String[] argument = { "cmd ", "/c ", "java -jar C:/Users/Utilisateur/JAVA/ESSAI/TOTONERO/Toto.jar" };
    			 final Process process  = rt.exec(argument);
    		     } 
    		 catch (IOException e1) {
    		 } 
    	
    	// Consommation de la sortie standard de l'application externe dans un Thread separe
    	new Thread() {
    		public void run() {
    			try {
    				BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    				String line = "";
    				try {
    					while((line = reader.readLine()) != null) {
    						// Traitement du flux de sortie de l'application si besoin est
    					}
    				} finally {
    					reader.close();
    				}
    			} catch(IOException ioe) {
    				ioe.printStackTrace();
    			}
    		}
    	}.start();
    
    	// Consommation de la sortie d'erreur de l'application externe dans un Thread separe
    	new Thread() {
    		public void run() {
    			try {
    				BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    				String line = "";
    				try {
    					while((line = reader.readLine()) != null) {
    						// Traitement du flux d'erreur de l'application si besoin est
    					}
    				} finally {
    					reader.close();
    				}
    			} catch(IOException ioe) {
    				ioe.printStackTrace();
    			}
    		}
    	}.start();
    
    	}
    }

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    et bien lisez le message d'erreur: la variable process n'existe pas. Et pour cause, elle n'existe que dans une petite portion de votre code qui n'inclue pas le thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		 try {
    			 String[] argument = { "cmd ", "/c ", "java -jar C:/Users/Utilisateur/JAVA/ESSAI/TOTONERO/Toto.jar" };
    			 final Process process  = rt.exec(argument);
    		     } 
    		 catch (IOException e1) {
    		 }
    Dès qu'on a fini le try, elle n'existe plus. La durée de vie d'une variable en java, c'est celle du bloc qui la contient.

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Il y'a aussi eclipse qui te souligne process en jaune aussi ... signifiant que process est instancié puis jamais utilisé ce qui devrait te mettre la puce a l'oreille...

    En effet tu déclare ton process dans un Try Catch() ce qui le rends "invisible" en dehors...
    Hors tu vas devoir l'utiliser en dehors du try catch (pas possible) ou tout simplement mettre les 2 thread aussi dans ce try catch.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    public class CopyOfCl_Process_developpez
    {
     
    	public static void main(String[] args)
    	{
    		// lancement de la commande
    		Runtime rt = Runtime.getRuntime();
     
    		try
    		{
    			String[] argument = { "cmd ", "/c ", "java -jar C:/Users/Utilisateur/JAVA/ESSAI/TOTONERO/Toto.jar" };
    			final Process process = rt.exec(argument);
     
    			// Consommation de la sortie standard de l'application externe dans un Thread separe
    			new Thread()
    			{
    				public void run()
    				{
    					try
    					{
    						BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    						String line = "";
    						try
    						{
    							while ((line = reader.readLine()) != null)
    							{
    								// Traitement du flux de sortie de l'application si besoin est
    							}
    						} finally
    						{
    							reader.close();
    						}
    					} catch (IOException ioe)
    					{
    						ioe.printStackTrace();
    					}
    				}
    			}.start();
     
    			// Consommation de la sortie d'erreur de l'application externe dans un Thread separe
    			new Thread()
    			{
    				public void run()
    				{
    					try
    					{
    						BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    						String line = "";
    						try
    						{
    							while ((line = reader.readLine()) != null)
    							{
    								// Traitement du flux d'erreur de l'application si besoin est
    							}
    						} finally
    						{
    							reader.close();
    						}
    					} catch (IOException ioe)
    					{
    						ioe.printStackTrace();
    					}
    				}
    			}.start();
    		} catch (IOException e1)
    		{
    		}
     
    	}
    }
    ou encore declaré process comme variable static de la classe et ne pas utiliser final.

    Edit : Doh trop lent !
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    Par défaut Bonjour Messieurs
    J'ai donc installé mes 2 threads à l'intérieur du try comme vous me l'avez

    recommandé et le problème est OK

    mais ... je suis à coté de la plaque car mon Toto.jar qui est appelé doit seulement affichier une mini fenetre graphique avec HelloWorld

    Dans ce cas, les 2 threads sont sans objet en l'état mais que faut-il conserver ?

    Je suis perdu !!!

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si tu n'as pas besoin des sorties de l'application, tu peux te contenter de fermer les flux concernés.

  6. #6
    Membre du Club Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Bonsoir,

    @michelp3 :
    • Je ne comprend pas trop le sens de ta question, que veux-tu conserver ?

    • Pour tes threads je te conseille vivement de les intégrer dans une classe à part.

    • J'essayerais de faire de mon mieux pour te créer un truc propre en rentrant chez moi

    @wax78 : Je ne pense pas qu'il soit correct de mettre un try sur un si grosse portion de code, et encore pire d'imbriquer les try...


    Cordialement,

    --
    .eden

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    les try imbriqué sont au contraire très propres dans son cas, il s'assurent la fermeture du reader.

  8. #8
    Membre du Club Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Bonsoir,

    Ne peut-il pas mettre le finally directement dans le try parent ?


    Cordialement,

    --
    .eden

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    non, en général avec les streams on a la structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try{
       Reader reader = ....;
       try{
          .... operations
       } finally {
          reader.close();
       }
    } catch (IOException e){
     //....
    }
    Parce que celle-ci est plus ch**

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
       Reader reader;
       try{
           reader = ....
           .... operations
       } catch (IOException e){
           ....
       } finally {
          try{
             if (reader!=null) //faut tester du coup 
                 reader.close();
          } catch (IOException e){
             // ben oui, le close lance des ioexceptions
          }
       }
       reader = null; //plus besoin

  10. #10
    Membre du Club Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Bonsoir,

    J'aurais plutôt vu en encapsulant le la lecture du flux dans une fonction qui throws l'IOException, mais c'est vrai que ta façon de faire est au final bien plus simple, moi je suis peut-être encore trop attachée au notion qui m'ont été apporté par mes études (on avait pas le droit à écrire des try imbriqués).

    Cordialement,

    --
    .eden

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    Par défaut Merci à tous
    En fait je pensais que l'exécution d'une appli extérieure nécessitait obligatoirement de gérer d'autres threads

    Dans mon cas où j"affiche simplement une fenetre avec helloworld ces threads sont sans objet

    LES threads evoqués ds mon exemple servent si je recois des infos du programe externe : ex : un fichier texte, ce qui n'est pas le cas --> ils sont inutiles

    Dites moi si je me trompe

  12. #12
    Membre du Club Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Si, tes threads sont dans un objet anonyme (un objet que tu ne pourras plus utiliser), sinon, tes threads servent tout de même à récupérer les éventuelles erreurs de ton programme appelé et des différents messages qui pourront être envoyé par l'application.

    Cordialement

  13. #13
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Citation Envoyé par dotEden Voir le message
    @wax78 : Je ne pense pas qu'il soit correct de mettre un try sur un si grosse portion de code, et encore pire d'imbriquer les try...
    .eden
    D'ou l'eventuelle 2 ème solution qui évite tout mettre dans le "try"", et je n'ais pas parlé d'imbriquer des try ??!
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre du Club Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Ah oui excuse moi, je n'avais pas lu la dernière phrase

    Cordialement

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    Par défaut Merci à tous
    j'ai éclairci certaines notions et c'est bien !!!

    Bonne soirée ou bonne journée , cela dépend

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pipe / thread /process /abus de language
    Par emardjean dans le forum MFC
    Réponses: 4
    Dernier message: 17/01/2006, 14h20
  2. Réponses: 2
    Dernier message: 27/10/2005, 14h44
  3. Différence entre process et thread
    Par Mastero dans le forum MFC
    Réponses: 6
    Dernier message: 19/07/2005, 13h52
  4. [Process]Execution de process dans un thread
    Par devjava dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2004, 10h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo