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 :

interruption et reprise d'un thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Par défaut interruption et reprise d'un thread
    Bonjour,
    Je me prends la tête avec les thread comme c'est pas permis !
    J'ai plein de questions. En voilà une :
    Je voudrais pouvoir interrompre et reprendre l'exécution d u thread interrompu. Il y a bien les méthodes suspend et resume mais elles sont "deprecated". Y a t il des équivalents ?
    Je demande cela car apparemment il n'y a pas de méthode pour reprendre l'exécution d'un thread interrompu par interrupt()...
    Merci bien.

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Dans ce genre de cas le mieux est de créer toi-même un thread interruptible, avec un flag (si l'action de ton Thread est cyclique).

    Voici un exemple d'implémentation (il te faudra évidemment ajouter des accesseurs sur les booléens running et finished pour pouvoir contrôler ton Thread...)

    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 class ThreadInterruptible extends Thread {
     
       private boolean running = false;
       private boolean finished = false;
     
       public void run() {
          while(!finished) {
             if(running) {
                // action du Thread
             } else {
                Thread.wait(1000); // attente de 1 seconde avant de tester
                // si l'action doit reprendre
             }
          }
       }
    }
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Par défaut
    merci bien

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Pour éviter une attente active avec un Thread.sleep(1000) (en passant Thread.wait n'existe pas en static), il faut utiliser des mécanismes de synchronisation :
    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 class PausableThread extends Thread {
     
    	private boolean paused;
     
    	@Override
    	public void run() {
    		try {
    			// du code
    			pauseIfNeeded(); // bloquant sans utiliser le processeur si le thread doit être en pause
    			// du code
    		} catch (InterruptedException e) {}
    	}
     
    	public synchronized void pause() throws InterruptedException {
    		paused = true;
    	}
     
    	public synchronized void unpause() {
    		paused = false;
    		notify();
    	}
     
    	private synchronized void pauseIfNeeded() throws InterruptedException {
    		if (paused) {
    			wait();
    		}
    	}
     
    }
    Après dans le code de ton run() tu mets des pauseIfNeeded() aux endroits où tu veux que le thread se bloque en attendant un unpause()...

  5. #5
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par ®om
    Pour éviter une attente active avec un Thread.sleep(1000) (en passant Thread.wait n'existe pas en static)
    oups... effectivement, j'ai tapé le code en direct un peu vite, et j'ai confondu les deux noms de méthode. Merci pour la rectification (et pour l'optimisation que tu as proposée)
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

Discussions similaires

  1. Interruption et reprise d'un Thread
    Par michaeljeru dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 12/04/2007, 18h17
  2. arret et reprise d'un thread
    Par voyageur dans le forum Windows Forms
    Réponses: 13
    Dernier message: 09/04/2007, 10h39
  3. Interruption et reprise d'un Thread
    Par Nuro dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 28/02/2007, 21h34
  4. pause et reprise de thread
    Par raggadoll dans le forum C++Builder
    Réponses: 5
    Dernier message: 12/07/2003, 10h50
  5. Pause et reprise d'un thread
    Par raggadoll dans le forum Linux
    Réponses: 5
    Dernier message: 03/07/2003, 20h22

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