Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon Thread ne veut pas m'obeir!

Comment mettre un Thread en "Wait"

    24 août 2016 à 19:16:55

    Je débute en programmation, et après avoir suivi quelques sujets à ma portée dans l'excellent cours de CYSBOY: "apprenez à programmer en JAVA", je voulais me lancer... mais mon passé de cancre refait surface et je me dis que j'ai encore dû manquer qque chose! :-)

    Qui peut m'aider?

    Je souhaitais commander le fonctionnement d'un Thread à partir d'un autre. j'ai synthétisé mon code dans les lignes qui suivent.

    Mon pb est une erreur: Exception in thread "main" java.lang.IllegalMonitorStateException, qui apparait lorsque je veut appliquer la méthode "wait()" à mon thread fils qui du coup ne s'arrête pas...

    Voici le code en question:


    public class Processus {
    
    	public static void main(String[] args) {
    		// Crée un nouveau Thread destiné à la simulation
    		Thread pSim = new PileSimulateur();
    		
    		//Lance le Thread:
    		pSim.start();
    		
    		try {
    			//On attend 5 secondes et on interrompt la simulation:
    			Thread.sleep(5000);
    			pSim.wait();
    			
    		} catch (InterruptedException e) {
    			// TODO Bloc catch généré automatiquement
    			e.printStackTrace();
    		}
    
    	}
    
    }
    
    public class PileSimulateur extends Thread {
    
    	public int chrono = 0;
    	
    	public void run(){
    		//Boucle while qui figure le temps qui passe
    		while(true){
    			
    			//Chrono(Test)
    			chrono = chrono + 1;
    			
    			//on attend une seconde
    			try {
    		    	//Processus.pSim.sleep(1000);
    				Thread.sleep(1000);
    		    } catch (InterruptedException e) {
    		        e.printStackTrace();
    		    }
    	        //puis on affiche:
    	        System.out.println(chrono);
    		}
    	}
    }
    

    et voici le résultat sur ma console:

    1
    2
    3
    4
    Exception in thread "main" java.lang.IllegalMonitorStateException
    	at java.lang.Object.wait(Native Method)
    	at java.lang.Object.wait(Unknown Source)
    	at Processus.main(Processus.java:14)
    5
    6
    7
    8

    Qqun a une idée pour éviter que je m'arrête avant d'avoir vraiment commencé?

    Et n'oubliez pas... je débute...:)


     



    • Partager sur Facebook
    • Partager sur Twitter
      25 août 2016 à 8:36:22

      Hello,

      C'est plutôt ambitieux de faire de la concurrence alors que tu débutes dans la programmation mais tant mieux :)

      Je pense que tu dois synchroniser ton Thread avec d'appeler la méthode wait dessus.

      Ce qui donnerait pour ton code :

      synchronized (pSim) {
          pSim.wait();
      }

      Référence : http://stackoverflow.com/questions/1537116/illegalmonitorstateexception-on-wait-call 

      • Partager sur Facebook
      • Partager sur Twitter
        25 août 2016 à 12:04:20

        Hello,

        c'est surement la méthode suspend() que tu devrais utiliser

        -
        Edité par ukusan 25 août 2016 à 12:05:22

        • Partager sur Facebook
        • Partager sur Twitter
          27 août 2016 à 9:59:55

          Merci Tyl0x, d'avoir pris le temps de intéresser à mon pb!

          J'ai essayé la solution que tu proposes,

          alors, en effet, mon exception n'apparait plus: et pour cause: l'instruction pSim.wait() ne s’exécute jamais...

          Il semble (en suivant le débogueur) qu’après la ligne synchronized (pSim){, le Thread fils (pSim) ne rende jamais la main au Thread principal (main)...

          Vois-tu pourquoi ?!?

          ukusan, merci à toi également!

          ta solution fonctionne parfaitement!

          j'ai utilisé ce code:

          public class Processus {
          
          	public static void main(String[] args) {
          		// Crée un nouveau Thread destiné à la simulation
          		Thread pSim = new PileSimulateur();
          		
          		//Lance le Thread:
          		pSim.start();
          		
          		try {
          			//On attend 5 secondes et on interrompt la simulation:
          			Thread.sleep(5000);
          			pSim.suspend();
          			//On attend 5 secondes et on la relance:
          			Thread.sleep(5000);
          			pSim.resume();
          			//Encore 5 secondes et on arrête définitivement le thread:
          			Thread.sleep(5000);
          			pSim.stop();
          			
          			
          		} catch (InterruptedException e) {
          			// TODO Bloc catch généré automatiquement
          			e.printStackTrace();
          		}
          
          	}
          
          }

          et ça marche exactement comme je le souhaitais!

          En revanche, Eclipse m'annonce que les méthodes suspend(), resume() et stop() sont "dépréciées"...

          Ca veut dire quoi? quels sont les risques pour mon programme, ma machine ?!?

          Merci

          -
          Edité par zede42 27 août 2016 à 10:09:46

          • Partager sur Facebook
          • Partager sur Twitter
            27 août 2016 à 22:44:52

            Super si ça correspond à tes attentes. Dépréciées veut dire que les fonctions n'existeront plus dans les prochaines versions et qu'il est donc déconseillé de les utiliser. En générale, d'autres fonctions les remplacent.

            Si tu es bon en anglais : https://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

            -
            Edité par ukusan 27 août 2016 à 22:46:15

            • Partager sur Facebook
            • Partager sur Twitter

            Mon Thread ne veut pas m'obeir!

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown