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 :

Arrêter / Stopper un Thread défini


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut Arrêter / Stopper un Thread défini
    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.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    ( http://articles.techrepublic.com.com...2-5144546.html )
    Si :
    - dans ton objet threadé, tu rajoute une variable qui est à true si le thread doit continuer son exécution, false sinon
    - lorsque tu crées ton thread, tu ranges une réf vers l'instance dans un vector, une Hashmapn ou autre collection selon ta préférence, par exemple au nom de ta DB, ou à quelque chose pouvant te servir de clé pour retrouver ce thread parmis tous les autres

    Si maintenant, lorsque tu veux arrêter le thread, (par exemple associé à la DB "machin"), tu fais une recherche dans ta collection (sur "machin"), puis fait un set sur ta variable signifiant l'arrêt du thread, cela devrait avoir le comportement que tu recherches.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut
    Okay j'vais m'aventurer dans ton idée.

    Effectivement, taper les thread dans une map pour ensuite les tuer en spécifiant la clé dans la map, c'est pas con.

    Au cas où....

    Y'a d'autres possibilités ?

  4. #4
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    C'est l'idée qui revient pas mal lorsqu'on parle de threads...

    Cependant, il faut absolument une structure itérative qui va scruter l'état de la variable booléenne. Dans le cas où il faut tuer une thread car elle a envoyé une requête qui va prendre trop de temps, j'imagine qu'il faut alors faire autrement, mais comment ? Générer une exception en cassant sa connexion, par exemple ?

  5. #5
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    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 690
    Par défaut
    En effet, la fonction interrupt() de la classe Thread est faite pour ça. Elle déclenche une Interrupted exception sur les opération d'IO bloquantes en cours dans le thread.

  6. #6
    Membre éprouvé Avatar de Celeborn
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 133
    Par défaut
    Renseigne toi aussi peut être sur les pool de connexion.

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

Discussions similaires

  1. Arrêter / Stopper un groupe de Threads ou ThreadGroup
    Par ouranos21 dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 09/04/2008, 11h03
  2. Réponses: 14
    Dernier message: 04/06/2007, 22h43
  3. Stopper un thread par un signal
    Par kazh75 dans le forum Général Python
    Réponses: 4
    Dernier message: 04/04/2007, 14h53
  4. Arrêter proprement le thread d'une JFrame
    Par fabrisss dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 04/12/2006, 12h32
  5. Stopper un thread
    Par Tenguryu dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2006, 21h57

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