subgenk
Messages postés85Date d'inscriptionvendredi 31 octobre 2008StatutMembreDernière intervention20 décembre 2012
-
12 juin 2009 à 12:02
Bonjour,
J'ai un gros problème avec les threads en java.
En fait pour faire un résumé, j'ai 3 classe thread service 1 service 2 service 3 qui ont chacun une méthode d'exécution à eux. Ensuite j'ai une classe Service général qui instancie ces 3 services et lors qu'il se démarre j'initialise un JMXAgent pour pouvoir contrôler mes 3 threads depuis la Jconsole.
J'ai donc dans mon jmxagent, 6 méthodes (2 pour chaque threads) qui arrete et (re)démarre le service.
Pour le code de mes run je peux le résumé à ça :
public void run() {
while (true) {
// si l'heure est valide pour exécuter le thread
if (DateManager.importPossible()) {
// tant que le thread est suspendu
while (threadSuspended) {
//on fait attendre le thread 10secondes
try {
wait();
} catch (InterruptedException ex) {
logger.error(ex.toString() + " " + ex.getLocalizedMessage());
}
}
try {
// Méthode propre d'un service
this.methodeDuService();
} catch (InitException ex) {
logger.error(ex.toString() + " " + ex.getLocalizedMessage());
}
} else {
// sinon on fait attendre le thread
try {
Thread.sleep(TIME_TO_WAIT);
} catch (InterruptedException ex) {
logger.error(ex.toString() + " " + ex.getLocalizedMessage());
}
}
}
}
Ensuite pour mes méthodes stop du MBean je peux les résumer comme cela :
public void stopService3() {
s3.setThreadSuspended(true);
etat_service3 = "Inactif";
}
etat_service(n) étant une variable de mon Mbean pour savoir si le thread actuel est actif on inactif.
threadSuspended est en fait une variable que j'utilise pour suspendre mon thread. J'ai utilisé ça faute d'avoir une méthode pour remplacer les méthodes dépréciées (resume, suspended et stop) du thread.java
et la méthode activer service du Mbean comme ceci :
public void startService3() {
etat_service3 = "Actif";
if (!s3.isAlive()) {
s3.run();
}
else
s3.setThreadSuspended(false);
}
Quand je lance mon programme je le fait de cette manière :
Le main qui fait construit un nouveau service général, qui dans son constructeur contient l'initialisation du JMX agent qui lui fait appelle ensuite au 3 méthodes de démarrage des services.
Ensuite j'ouvre la Jconsole, aucun problème pour me connecter, et je trouve mon mbean avec toutes les méthodes. Là quand j'essaye d'arrêter un service tout se passe bien. Et quand je redémarre le service 2 ou 3 après cela, je me tape un JavaNullPointerException... Sans comprendre pourquoi car niveau objet tout est instancié j'en suis sur j'ai fais la vérification plusieurs fois...
Quelqu'un aurait une idée ? Je sais que je débute avec les threads et JMX donc j'ai peut-être zappé un truc..