Bonjour codes sources. Je vous soumets ce qui reste un mystere après moulte reherches et tests et force débogage.
Je cherche à implementer une communication depuis un thread vers l'EventDispatchThread.
J'ai un probleme lorsque je lance un thread (qui est censé etre arrété) pour la deuxieme fois:
Le message "java.lang.IllegalThreadStateException" est généré alors que le thread est mort. Normalement ce message arrive si le thread est en cours.Problème de Garbage collector?, de conflit entre le thread et l'EventDispatchThread ? Je n'ai pas trouvé d'explication théorique, alors je compte sur votre expérience pour me débloquer.
voici la source : (Le code est une application qui tourne et qui illustre le bug - Merci de vos réponses éclairées)
package testThread;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class Test extends JFrame {
private ThreadChargement threadChargement=null;
private JPanel jContentPane = null;
private JButton jButton = null; // @jve:decl-index=0:visual-constraint="302,-21"
private JLabel jLabel = null; // @jve:decl-index=0:visual-constraint="478,113"
//Constructeur
public Test(){
super();
this.setTitle("lancer deux fois le thread pour constater le message d'erreur");
this.setSize(new Dimension(500,120));
this.setContentPane(getJContentPane());
//debut de la partie critique
getJButton().addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("Clic sur Boutton");
try {
charger();
} catch (Exception e1) {
final Exception ex=e1;
SwingUtilities.invokeLater(new Runnable() {
public void run(){
getJLabel().setText(ex.toString() + " ; Message="+ex.getMessage());
}
});
System.err.println(e1.toString());
}
}
});
this.setVisible(true);
}
public void charger(){
if (threadChargement==null)
threadChargement=new ThreadChargement();
while(threadChargement.isAlive()){} //on attend que le thread soit stoppé (pour être sûr)
threadChargement.start();
}
class ThreadChargement extends Thread {
public Boolean actif=false;
public void run(){
actif=true;
SwingUtilities.invokeLater(new Thread() {
public void run(){
getJLabel().setText("je suis un message emis dans l'EDT depuis le Thread chargement");
}
});
System.out.println("coucou depuis le thread de chargement");
actif=false;
}
}
//fin de la partie critique
//accesseurs pour les composants
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJButton(),BorderLayout.CENTER);
jContentPane.add(getJLabel(),BorderLayout.SOUTH);
}
return jContentPane;
}
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton("lancer le thread");
}
return jButton;
}
private JLabel getJLabel() {
if (jLabel == null) {
jLabel = new JLabel();
jLabel.setText("JLabel");
jLabel.setSize(new Dimension(141, 50));
}
return jLabel;
}
//methode MAIN
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Test();
}
});
}
}
Imaginer, c'est retrouver un déjà vu que l'on ne connaissait pas.