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" ):

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();
 
        }
   ...
  }
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
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
		} 
	}
La méthode qui va chercher la liste des schèmas.

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.