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 :

souci pour lancer des Thread simultanément


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre du Club Avatar de Tyrael62
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 90
    Points : 54
    Points
    54
    Par défaut souci pour lancer des Thread simultanément
    Bonjour à tous ,
    j'ai un soucis au niveau de mes threads pour mon bouton "rechercher".
    Quand j'en lance deux en même temps , mes onglets s'ouvrent bien mais dans le premier rien ne s'affiche , seulement dans le dernier lancé.
    Je vous ci-joint le code que j'utilise.Si vous pouvez me dire où ça pêche?

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.DecimalFormat;
     
    import javax.swing.Icon;
    import javax.swing.JApplet;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JProgressBar;
    import javax.swing.JTabbedPane;
    import javax.swing.SwingUtilities;
    import javax.swing.plaf.IconUIResource;
     
    public class Index extends JApplet implements ActionListener {
     
    	static int idxproj = 4;//Index id_proj dans requete SQL	
    	public Tableau pan0;
    	public JPanel centre = new JPanel();
    	public JLabel lab0;
    	public Dimension dim0;//Taille fenetre	
    	public static Menu mbar;//Menu applet	
    	//static Chargement ch,ch1;//Barres de chargements	
    	public boolean indic = true;//Indicateur couleurs on/off
    	public Thread th;//thread applet
    	private Thread[] ths;
    	int checkThread;
    	public Parametres[] param = new Parametres[100];
    	public Jtab tabPan = new Jtab();	
    	public JPanel chargement;
     
    	/** {@docRoot} constructeur applet */
    		public void init() {
     
    			checkThread = 0;
    			ths = new Thread[100];
    			//Conteneur applet
    	    	 BorderLayout orientation = new BorderLayout();
    	    	 setLayout(orientation);
    	    	//Menu + écouteurs 
    	    	mbar = new Menu();
    	    	mbar.imprim.addActionListener(this);
    	    	mbar.export.addActionListener(this);
    	    	mbar.rechercher.addActionListener(this);
    	    	//param = new Parametres(mbar);	    	
    	    		//mbar.caseACocher.addActionListener(this);
    	    	//Configuration réseaux, identifiants, url
    	    	Conf servConf = new Conf();
    	    	//Chargement paremetres de sécurité
    	    	System.setProperty("java.security.policy",servConf.servSec(Conf.actConf));
    	    	System.setProperty("java.rmi.server.hostname",servConf.urlHote(Conf.actConf));
    	    	System.setProperty("java.rmi.server.codebase",servConf.urlSec(Conf.actConf));
    	    	//Mise en page applet
    			lab0 = new JLabel("Tableau");
    			dim0 = new Dimension(500,500);
    			JPanel chargPan = new JPanel();
    			add("North",mbar);
    		    add("South",chargPan);		    
    			add("Center",tabPan);
    			setSize( 1200,800);
    			this.show();
    		}
     
    		public void start(){
    			System.out.println();
    		}
     
    		/** {@docRoot}Action sur écouteurs (imprimer,rechercher)*/
    		public void actionPerformed(ActionEvent e) {
     
     
     
    	    	 if(e.getActionCommand().equals("Rechercher")){
     
    	    		//comboBoxChanged
    	    		checkThread++;
    	    		//Gestion de la fermeture des onglets
    	    		int nbOnglet = tabPan.getComponentCount()+1;
    	    		if(checkThread>=nbOnglet){	
    	    		checkThread = nbOnglet-1;
    	    		}
     
    	    		new Thread(new Runnable() {	    			
    	    			public void run() {	
     
    			    		try {
     
    			    			//Chargement du tableau			
    							param[checkThread] = new Parametres(mbar);
    			    			param[checkThread].setOnglet(checkThread);
    			    			chargement = new JPanel();
    			    			chargement.add(new JLabel("<html><font color ='red'>Chargement</font></html>"));
    							tabPan.addTab("chargement en cours "+param[checkThread].getOnglet(),chargement);
    			    			tabPan.setName("charg "+checkThread+" "+param[checkThread].getOnglet());
    			    		    pan0 = new Tableau(param[checkThread]);
    			    		    ths[checkThread] = new Thread(pan0);
    							ths[checkThread].start();
    							ths[checkThread].setName(param[checkThread].getTitre());
     
    						synchronized (ths[checkThread]) {
    							System.out.println(checkThread);
     
    			    			   tabPan.setComponentAt(param[checkThread].getOnglet(),pan0);
    			    			   tabPan.setTitleAt(param[checkThread].getOnglet(),param[checkThread].getTitre());
     
    						}
     
    		    			repaint();
     
    			    		    }
     
    			    		catch (Exception e1) {
    							JOptionPane.showMessageDialog(null, "Tableau indisponible - Données insuffisantes.");
    							e1.printStackTrace();
    						}    				
     
    	    			}	
     
    	    		}).start();	 
     
     
    	    	}
    }

  2. #2
    ndp
    ndp est déconnecté
    Membre actif Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Points : 255
    Points
    255
    Par défaut
    salut,

    ce que je vois deja, c'est que tes threads se partagent des variables sans synchronization. Peut etre peux tu lister toutes les variables partagees et les verifier.

  3. #3
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Le code est illisible. J'ai regardé tout de même et j'ai confirmé le fait que tu n'utilisais pas les méthodes de SwingUtilities invokeAndWait ou invokeLater. Or ceci est obligatoire, on ne doit pas lançer des threads qui effectuent des traitements sur l'interface sans que ceux ci soient synchronisés avec l'EDT.

  4. #4
    Membre du Club Avatar de Tyrael62
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 90
    Points : 54
    Points
    54
    Par défaut
    EDT ?
    Tu peux expliquer ? A vrai dire , je suis encore débutant en java , je travaille sur le code de mon collègue qui lui m'explique rien de ce qu'il a fait , première fois que je vois les threads et même avec les cours sur internet , je suis encore un peu largué par rapport à tous ça.

  5. #5
    Membre du Club Avatar de Tyrael62
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 90
    Points : 54
    Points
    54
    Par défaut
    J'ai tenté une autre méthode mais j'en reviens au même résultat.
    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
     
    	else if(e.getActionCommand().equals("Rechercher")){
     
    	    		//comboBoxChanged
    	    		checkThread++;
    	    		//Gestion de la fermeture des onglets
    	    		int nbOnglet = tabPan.getComponentCount()+1;
    	    		if(checkThread>=nbOnglet){	
    	    		checkThread = nbOnglet-1;
    	    		}
    	    		 final Runnable ChargTab = new Runnable() {
    	    		     public void run() {
    						   tabPan.setName("charg "+checkThread+" "+param[checkThread].getOnglet());
    						   ths[checkThread].setName(param[checkThread].getTitre());
    		    			   tabPan.setComponentAt(param[checkThread].getOnglet(),pan0);
    		    			   tabPan.setTitleAt(param[checkThread].getOnglet(),param[checkThread].getTitre());
     
     
    	    		     }
    	    		 };    		
    	    		new Thread(){public void run() {	
     
    			    		try {
    							param[checkThread] = new Parametres(mbar);
    			    			param[checkThread].setOnglet(checkThread);
    			    			chargement = new JPanel();
    			    			chargement.add(new JLabel("<html><font color ='red'>Chargement</font></html>"));
    							tabPan.addTab("chargement en cours "+param[checkThread].getOnglet(),chargement);
    			    			pan0 = new Tableau(param[checkThread]);
    			    		    ths[checkThread] = new Thread(pan0);
    							ths[checkThread].start();
    							SwingUtilities.invokeAndWait(ChargTab);
     
    		    			repaint();
     
    			    		    }
     
    			    		catch (Exception e1) {
    							JOptionPane.showMessageDialog(null, "Tableau indisponible - Données insuffisantes.");
    							e1.printStackTrace();
    						}    				
     
    	    			}	
     
    	    		}.start();
    En fait , quand je lance mes 2 onglets simultanément , le programme récupère le titre du dernier lancer , dans cet onglet il récupère le tableau du premier onglet avant de charger le dernier tableau demandé dans ce même onglet et le premier onglet ne charge rien.

  6. #6
    ndp
    ndp est déconnecté
    Membre actif Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Points : 255
    Points
    255
    Par défaut
    salut,

    de ce que ce sais, les objets graphiques Swing ne sont pas thread safe, et donc comme semble le dire darkxan, la facon standard Swing de gerer ce probleme, c'est de laisser swing lancer lui-meme les threads, que tu auras 'enregistre' (donc pas de .start() dans ton code).

    Ca c'est pour le cote Swing que je connais pas tres bien. Malgre ca, je pense que si tes threads utilise des variables partagees autre que les elements graphique swing, l'utilitaire Swing SwingUtilities ne sera pas utile, et tu devras quand meme verifier que tes threads sont bien synchronizes par rapport a l'acces a ces variables.

  7. #7
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 621
    Points : 15 700
    Points
    15 700
    Par défaut
    Pour comprendre le fonctionnement de l'EDT je te conseille http://rom.developpez.com/java-swingworker/

    Après a toi de voir si la classe SwingWorker est adaptée à ton programme. Si tu veux simplemebt exectuer un code dans l'EDT il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            //code a executer dans l'EDT
        }
    });

  8. #8
    Membre du Club Avatar de Tyrael62
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 90
    Points : 54
    Points
    54
    Par défaut
    J'ai essayé ta méthode , elle est pas mal mais c'est pas ce que je recherche , quand je lance un premier onglet , je ne peux pas en lancer un deuxième dans le même temps , il me bloque le programme tant que le thread lancé n'est pas terminé.

  9. #9
    Membre du Club Avatar de Tyrael62
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 90
    Points : 54
    Points
    54
    Par défaut
    J'ai finalement réussi à faire comme je voulais pour les ouvrir en même temps.
    Pour ceux que ça intéresserait , je laisse mon code à disposition.

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    public class Index extends JApplet implements ActionListener {
     
    	static int idxproj = 4;//Index id_proj dans requete SQL	
    	public Tableau pan0;
    	public JPanel centre = new JPanel();
    	public JLabel lab0;
    	public Dimension dim0;//Taille fenetre	
    	public static Menu mbar;//Menu applet	
    	//static Chargement ch,ch1;//Barres de chargements	
    	public boolean indic = true;//Indicateur couleurs on/off
    	public Thread th;//thread applet
    	private Thread[] ths;
    	public int checkThread;
    	public Parametres[] param = new Parametres[100];
    	public Jtab tabPan = new Jtab();	
    	public JPanel chargement;
     
    	/** {@docRoot} constructeur applet */
    		public void init() {
     
    			checkThread = 0;
    			ths = new Thread[100];
    			//Conteneur applet
    	    	 BorderLayout orientation = new BorderLayout();
    	    	 setLayout(orientation);
    	    	//Menu + écouteurs 
    	    	mbar = new Menu();
    	    	mbar.imprim.addActionListener(this);
    	    	mbar.export.addActionListener(this);
    	    	mbar.rechercher.addActionListener(this);
    	    	//param = new Parametres(mbar);	    	
    	    		//mbar.caseACocher.addActionListener(this);
    	    	//Configuration réseaux, identifiants, url
    	    	Conf servConf = new Conf();
    	    	//Chargement paremetres de sécurité
    	    	System.setProperty("java.security.policy",servConf.servSec(Conf.actConf));
    	    	System.setProperty("java.rmi.server.hostname",servConf.urlHote(Conf.actConf));
    	    	System.setProperty("java.rmi.server.codebase",servConf.urlSec(Conf.actConf));
    	    	//Mise en page applet
    			lab0 = new JLabel("Tableau");
    			dim0 = new Dimension(500,500);
    			JPanel chargPan = new JPanel();
    			add("North",mbar);
    		    add("South",chargPan);		    
    			add("Center",tabPan);
    			setSize( 1200,800);
    			this.show();
    		}
     
    		public void start(){
    			System.out.println();
    		}
    public void actionPerformed(ActionEvent e) {
    if(e.getActionCommand().equals("Rechercher")){
     
       	    		//comboBoxChanged
       	    		checkThread++; 
    	    		//Gestion de la fermeture des onglets
    	    		int nbOnglet = tabPan.getComponentCount()+1;
    	    		if(checkThread>=nbOnglet){	
    	    		checkThread = nbOnglet-1;
    	    		}
    			  new ThreadTransfert(checkThread).start();	 
     
     
    	    	}
    }
    	    public class ThreadTransfert  extends Thread {
    	    	int chkThread;
    	    	//Constructeur
    	    	ThreadTransfert(int checkThread){
    	    		chkThread=checkThread;
    	    	}
    	        public void run() {
     
     
    		    		try {
     
    		    			//Chargement du tableau			
    						param[chkThread] = new Parametres(mbar);
    		    			param[chkThread].setOnglet(chkThread);
    		    			chargement = new JPanel();
    		    			chargement.add(new JLabel("<html><font color ='red'>Chargement</font></html>"));
    						tabPan.addTab("chargement en cours "+param[chkThread].getOnglet(),chargement);
     
    					    pan0 = new Tableau(param[chkThread]);
    					    ths[chkThread] = new Thread(pan0);
    						//ths[checkThread].start();
     
    					synchronized(ths[chkThread]) {
     
    						System.out.println(chkThread);
     
    						   //tabPan.setName("charg "+checkThread+" "+param[checkThread].getOnglet());
    						   ths[chkThread].setName(param[chkThread].getTitre());
    		    			   tabPan.setComponentAt(param[chkThread].getOnglet(),pan0);
    		    			   tabPan.setTitleAt(param[chkThread].getOnglet(),param[chkThread].getTitre());
     
    					}
     
    					repaint();
    						}			    						    		    				
    		    		catch (Exception e1) {
    						JOptionPane.showMessageDialog(null, "Tableau indisponible - Données insuffisantes.");
    						e1.printStackTrace();
    					}    
     
    	        }
     
    	    }
    }

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

Discussions similaires

  1. [Thread] Probleme pour arreter des threads
    Par Djobird dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 15/02/2008, 21h31
  2. [Mail] souci pour envoyer des e-mails en php
    Par nemines1 dans le forum Langage
    Réponses: 4
    Dernier message: 19/05/2007, 13h07
  3. Acces limite pour lancer des requetes pour certains
    Par Boubas1 dans le forum Sécurité
    Réponses: 2
    Dernier message: 02/05/2007, 14h37
  4. Réponses: 3
    Dernier message: 25/12/2006, 17h27
  5. Réponses: 7
    Dernier message: 10/10/2005, 18h54

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