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

Java Discussion :

Arrêter un thread par son nom


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Par défaut Arrêter un thread par son nom
    Bonjour,
    Je cherche comment chercher et arrêter un thread par son nom.
    Ci dessous j'ai deux classes avec deux main.
    La première lance un thread avec le nom "MyThread0".
    La deuxième, utilisant l'api "commons-lang3", cherche ce thread par son nom et essaies de l’interrompre.
    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
    18
    19
    20
    21
    22
    23
    24
    25
    package com.threads;
     
    import java.util.Date;
     
    class MyThread extends Thread{
    	public MyThread(String name) {
    		this.setName(name);
    	}
    	@Override
    	public void run() {
    		int i = 20;
    		while(i > 0){
    			System.out.println("Thread ["+Thread.currentThread().getThreadGroup().getName()+" , "+this.getId()+" , "+ this.getName()+"]  :" + new Date()+  " Boucle infinie !");
    		}
    	}
    }
     
    public class MainTh1 {
     
    	public static void main(String[] args) {
    		MyThread m = new MyThread("MyThread0");
    		m.start();
    	}
     
    }
    J'exécute MainTh1

    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
    18
    19
    package com.threads;
     
    import java.util.Collection;
     
    import org.apache.commons.lang3.ThreadUtils;
     
    public class MainTh2 {
     
    	public static void main(String[] args) {
    		Collection<Thread> liste = ThreadUtils.findThreadsByName("MyThread0");
    		System.out.println(liste.size());
    		if(liste!=null && !liste.isEmpty()){
    			for(Thread t : liste){
    				t.interrupt();
    			}
    		}
    	}
     
    }
    J'exécute MainTh2
    MainTh2 ne trouve aucun thread avec le nom "MyThread0", alors qu'il est déjà en exécution (Boucle infinie).
    Comment je peux arrêter mon thread à partir de MainTh2 ?

    Merci pour votre retour.

  2. #2
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut
    Je pense que comme tu lance 2 programmes différents tu obtiens 2 process diférents. Ils ne partagent pas donc pas le même contexte. Ton main 2 n'as pas accès à ton MyThread0, il ne le connait pas/ne le voit pas.
    C'est donc normal qu'il ne le trouve pas.

    Je pense que si tu appelle findThreadsByName() depuis ton main1 tu doit obtenir ton thread

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Attention interrupt() ne fait que changer un état (pour certaines méthodes on obtiendra une exception), mais le thread ne s'arrêtera pas pour autant s'il ignore ce changement d'état.

    Thread non interruptible
    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
    18
    19
    20
    21
    22
    23
    24
    public static void main(String[] args) {
     
    		Thread thread = new Thread(()-> {
     
    			while(true) {
    				System.out.println("Thread is running...");
    				try {
    					Thread.sleep(500);
    				} catch (InterruptedException e) { 
    				}
    			}
     
     
    		});
    		thread.start();
     
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) { 
    		}
    		System.out.println("Interrupt thread");
    		thread.interrupt();
     
    	}
    Thread non interruptible :
    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
    18
    19
    20
    21
    22
    public static void main(String[] args) {
     
    		Thread thread = new Thread(()-> {
     
    			while(true) {
    				System.out.println("Thread is running...");
    				long time=System.currentTimeMillis();
    				while( System.currentTimeMillis()-time<500 ) Thread.yield();
    			}
     
     
    		});
    		thread.start();
     
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) { 
    		}
    		System.out.println("Interrupt thread");
    		thread.interrupt();
     
    	}
    Thread non interruptible:
    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
    18
    19
    20
    21
    22
    23
    24
    public static void main(String[] args) {
     
    		Thread thread = new Thread(()-> {
     
    			for(int i=0; i<1000; i++) {
    				System.out.println("Thread is running..."+i);
    				try {
    					Thread.sleep(500);
    				} catch (InterruptedException e) {  
    				}
    			}
     
     
    		});
    		thread.start();
     
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) { 
    		}
    		System.out.println("Interrupt thread");
    		thread.interrupt();
     
    	}
    Thread interruptible :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    public static void main(String[] args) {
     
    		Thread thread = new Thread(()-> {
     
    			while(true) {
    				System.out.println("Thread is running...");
    				try {
    					Thread.sleep(500);
    				} catch (InterruptedException e) { 
    					break;
    				}
    			}
     
     
    		});
    		thread.start();
     
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) { 
    		}
    		System.out.println("Interrupt thread");
    		thread.interrupt();
     
    	}
    Thread interruptible :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    public static void main(String[] args) {
     
    		Thread thread = new Thread(()-> {
     
    			for(int i=0; i<1000; i++) {
    				System.out.println("Thread is running..."+i);
    				try {
    					Thread.sleep(500);
    				} catch (InterruptedException e) { 
    					break;
    				}
    			}
     
     
    		});
    		thread.start();
     
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) { 
    		}
    		System.out.println("Interrupt thread");
    		thread.interrupt();
     
    	}
    Thread interruptible :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public static void main(String[] args) {
     
    		Thread thread = new Thread(()-> {
     
    			for(int i=0; i<1000; i++) {
    				System.out.println("Thread is running..."+i);
    				long time=System.currentTimeMillis();
    				while( System.currentTimeMillis()-time<500 ) {
    					if ( Thread.currentThread().isInterrupted() ) {
    						System.out.println("Interrupted");
    						i=1000;
    						break;
    					}
    					Thread.yield();
    				}
    			}
     
     
    		});
    		thread.start();
     
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) { 
    		}
    		System.out.println("Interrupt thread");
    		thread.interrupt();
     
    	}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre éclairé Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Par défaut
    Merci pour vos retours.
    Donc si j'ai bien compris, il y a aucun moyen de stopper un thread contenu dans un thread différent ?

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Il faut le gérer à la main.

    Si une instruction permettait de couper un thread en plein dans l'exécution d'une instruction. Cela pourrait avoir des effets néfastes.

    Un thread qu'on peut couper, c'est souvent qu'il a une pile de travail.
    Et cela ressemble un peu à ce genre de "truc":

    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
    18
    19
    20
    21
    22
    23
     
    Blabla implements Runnable {
    	private boolean stopIsRequested = false;
     
            public boolean doTask() throws Exception;
     
    	public void run() {
    		try {
    			while(!stopIsRequested) {
    				if(!doTask()) {
    					break;
    				}
    			}
    		}
    		catch(Throwable t) {
    			LOGGER.error(t.getMessage(), t);
    		}
    	}
     
     
    	public void stop() {
    		stopIsRequested =true;
    	}

  6. #6
    Membre éclairé Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Par défaut
    Merci pour les réponses.
    Je vais vous expliquer ce que je cherche derrière tous cela.
    J'ai une table dans ma base de données. Chaque ligne de cette table correspond à une demande de lancement d'un batch (exécution d'une requête prédéfinie et écriture de résultat dans un fichier csv, xl, txt) (Exemple de requête : select a.id, a.nom.. from table a where a.date=?...).
    Mon application Java (que je développe) consiste à lire dans cette table et lancer le batch correspondant dans un thread (pour l’exécution parallèle des batchs).
    La question que je me posais et d'ailleurs l'objet dérriere cette discussion, est de savoir la possibilité de stopper un thread qui exécute un batch.

    J'espère que j'étais clair. Je ne sais pas si je me procède de la bonne façon ou non?

    Mes excuses aux modérateurs si cette discussion concerne un autre sous forum.

Discussions similaires

  1. Réponses: 9
    Dernier message: 01/12/2005, 15h38
  2. Accéder à une propriété par son nom
    Par Neilos dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/09/2005, 21h34
  3. Accéder à un serveur linux par son nom
    Par flatron dans le forum Réseau
    Réponses: 6
    Dernier message: 01/07/2004, 14h27
  4. Réponses: 4
    Dernier message: 06/06/2004, 12h07

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