Bonjour,
J'ai une appli multithread (de monitoring de DB) où un thread père crée environ 350 threads enfants (où 1 thread correspond à une DB).
Alors pour arrêter TOUT les thread, easy: je kill le thread papa.
Mais comment pourrais-je faire pour tuer ou stopper/arrêter UN thread bien défini. Où par exemple, en ligne de commande, la commande ressemblerait à quelque chose du genre :
?java -jar Client.jar -stop le_nom_de_ma_DB
Quelque petits bouts de code afin que vous compreniez comment est monté mon appli (j'aime à l'appeler "Mon bordel"):
Le run appel la méthode select qui va lister un tas de schèmas (environ 350, récupèrés depuis une table), et pour chacun de ses schèma, ma classe va instancier un thread enfant qui va tester des DML, en boucle, sur le schèma afin de voir si la DB se porte bien ou pas, la monitorer quoi...
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 public void run() { int i=0; boolean fin = false; try { connexionDB(); select(request2); System.out.println("Dans le run de ThreadConnexion: "+request2); sleep(1000); connexion.close(); } ... }
La méthode qui va chercher la liste des schèmas.
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 public void select(String request) { try { Statement stm = con.createStatement(); rs = stm.executeQuery(request); PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true); while (rs.next()) //fetching the resultset { db_name=rs.getString(1); // <= Nom de la DB vers laquelle on doit envoyer un thread DB_type=rs.getString(2); select2(db_name,DB_type); } rs.close(); //close the resultset } }
Et celle qui va instancier un thread pour chaque schèmé récupéré:
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 public void select2(String db_name,String DB_type) { try { Statement stm = con.createStatement(); rs2 = stm.executeQuery(subrequest2); PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true); while (rs2.next()) //fetching the resultset { ThreadChild tc = new ThreadChild(db_name,suburl,sublogin,subpasswd,DB_type,connexion,driver); tc.start(); cpt++; } rs2.close(); //close the resultset } }
Donc voilà, je répète: pour tuer tout les threads, facile, on tue thread père. Mais pour tuer UN des threads que papa à créé, comment je fais ?
On m'a déjà conseillé de regarder du côté des ThreadPool et des ThreadGroup, mais je patauge un peu, et je vois mal en quoi les threadGroup et les threadPool pourraient résoudre mon problème.
Si y'a une bonne âme pour m'éclairer... C'serait bien gentil.
Partager