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

  1. #1
    Membre régulier 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
    Points : 92
    Points
    92
    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 éprouvé 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 : 29
    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
    Points : 1 014
    Points
    1 014
    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
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    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 régulier 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
    Points : 92
    Points
    92
    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
    Points : 9 818
    Points
    9 818
    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;
    	}
    Je ne répondrai à aucune question technique en privé

  6. #6
    Membre régulier 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
    Points : 92
    Points
    92
    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.

  7. #7
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Mais c'est quoi ton batch ? Un programme externe ?
    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.

  8. #8
    Membre régulier 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
    Points : 92
    Points
    92
    Par défaut
    Je développe avec Spring batch

  9. #9
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je ne connais pas vraiment Spring Batch, mais il doit y avoir un support pour annuler un job (voir JobOperator...).
    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.

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Je rappelle aussi a toutes fins utiles que la classe Thread dispose de 2 (!) méthodes pour tester si elle a été interrompue en invoquant interrupt() donc pas trop besoin de mettre son propre sémaphore en fait :

    • isInterrupted() - renvoie le statu d'interruption ;
    • interrupted() - renvoie le statu d'interruption et le réinitialise(danger)


    Du coup quand on est dans un Runnable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (!Thread.currentTread().isInterrupted()) {
      // ...
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    pour autant que tes steps dans spring batch ne tournent pas pendant des heures, spring batch gère déjà tout ce qu'il faut via le joboperator. Si t'as arrêté le batch, la step suivante ne démarrera pas.

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