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 :

Problème de compréhension des threads


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant DUT Informatique
    Inscrit en
    Janvier 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant DUT Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Problème de compréhension des threads
    Bonjours, je suis actuellement en deuxième année de DUT Informatique et nous avons attaqué la programmation multithreads/multiprocessus.
    Nous avons vue les Threads en Java mais mon problème est la, j'ai du mal a comprendre le fonctionnement. Pour m’entraîner j’exécute un petit boue de code que j'ai trouvé sur internet pour essayer de comprendre le fonctionnement exact. Je sais qu'un thread à 3 états, "En vie, En attente ou mort". Je sais aussi que pour mettre en attente un processus on peut le faire de plusieurs manière, ici la méthode utilisé est "sleep". Mon problème est la compréhension et l'interprétation du résultat obtenue, je m'en remet donc à vous.

    Voici le code:

    La class principale:

    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 class Main {
     
    	public Main() {
     
    	    FirstThreads t = new FirstThreads(); 
    	    t.start();
     
    	    while(t.isAlive() ) {
    	      System.out.println("Je suis le MAIN.");
    	      try {
    	        t.sleep(800);
    	      }
    	      catch (InterruptedException ex) {}
    	    }
     
    	  }
     
    	public static void main(String[] args) {
    		new Main();
    	}
     
    }
    La class du 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 FirstThreads extends Thread {
     
    	public FirstThreads() {
     
    	}
     
    	public void run() {
    	    long start = System.currentTimeMillis();
    	    while( System.currentTimeMillis() < ( start + (1000 * 5))) {
    	      System.out.println("Je suis le FIRSTTHREAD.");
    	      try {
    	        Thread.sleep(500);
    	      }
    	      catch (InterruptedException ex) {}
    	    }
    	  }    
    }
    Le résultat:

    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
    Je suis le MAIN.
    Je suis le FIRSTTHREAD.
    Je suis le FIRSTTHREAD.
    Je suis le MAIN.
    Je suis le FIRSTTHREAD.
    Je suis le FIRSTTHREAD.
    Je suis le MAIN.
    Je suis le FIRSTTHREAD.
    Je suis le MAIN.
    Je suis le FIRSTTHREAD.
    Je suis le FIRSTTHREAD.
    Je suis le MAIN.
    Je suis le FIRSTTHREAD.
    Je suis le MAIN.
    Je suis le FIRSTTHREAD.
    Je suis le FIRSTTHREAD.
    Je suis le MAIN.

  2. #2
    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
    Citation Envoyé par chimanos Voir le message
    Pour m’entraîner j’exécute un petit boue de code
    Ben va falloir nettoyer

    Citation Envoyé par chimanos Voir le message
    Mon problème est la compréhension et l'interprétation du résultat obtenue, je m'en remet donc à vous.
    Qu'est-ce que tu ne comprends pas dans l'output?

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Je pense que l’incompréhension vient de ces deux appels :
    Le premier appel est utilisé sur l'objet "FIRSTTHREAD". Ce qui sous entends qu'on veux mettre en veille "FIRSTTHREAD".
    Cependant, la méthode sleep est static :
    http://docs.oracle.com/javase/7/docs...leep%28long%29
    Causes the currently executing thread to sleep (temporarily cease execution)
    Donc :
    Provoque une pause de "MAIN".

    Ce qui fait que tu as environ deux affichage de"FIRSTTHREAD" pour chaque "MAIN"

    Cordialement,
    Patrick Kolodziejczyk.

    PS :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Message subliminale pour Anomaly
    //+1 pour la nouvelle notation CIL à la place de codeinline
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Etudiant DUT Informatique
    Inscrit en
    Janvier 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant DUT Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Bonsoir, merci pour vos réponses, oui l'incompréhension venait principalement de la, je vois déjà un peut mieux, mais la méthode "wait()" est elle elle aussi static ? Qu'elle est la différence entre "wait()" et "sleep(time)"?

  5. #5
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 576
    Points : 1 989
    Points
    1 989
    Par défaut
    Je suis pas expert mais wait() attend d'être réveillé par un autre processus alors que sleep ne peut pas il n'ai pas à l'écoute des signaux, je crois wait() c'est surtout pour la synchronisation des processus quand tu veux qu'un processus t2 se lance mais qu'il à besoin d'information d'un processus t1 wait est-utile , en espérant ne pas avoir raconter de bétises .

  6. #6
    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
    wait est totalement différent de sleep. Sleep sert à dormir et est lié à la classe Thread. La couple de méthodes wait/notify sert à créer des mutex, nécessaires pour la synchronisation entre processus. wait / notify sont présent sur tous les objets, permettant qu'utiliser n'importe quel objet comme mutex.

    Si tu cherche à endormir un thread quelconque et non pas le thread courant, comme le fait Thread.sleep, c'est peine perdue. Seul le thread concernée peux décider de s'endormir, on ne peux pas l'y forcer. Il n'y rien pour ça.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Par contre, si on veut qu'un thread soit capable de s'endormir à la demande, il suffit de le programmer de sorte qu'il regarde si quelqu'un lui a demandé de dormir, et si oui, de le faire. Logique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Etudiant DUT Informatique
    Inscrit en
    Janvier 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant DUT Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Donc en gros si j'ai bien compris, sleep endors le processus courant, et wait lui permet de mettre en pause un processus, on ce sert donc de wait pour faire la synchronisation entre les threads ?

  9. #9
    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
    non wait concerne le thread courant aussi. Il attends sur le sémaphore (celui dont tu as appelé la méthode wait) que quelqu'un l'active (notify)

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 072
    Points : 7 974
    Points
    7 974
    Par défaut
    Tiens aussi je ne vois personne dire un truc qui me semble important...

    Quand on joue avec des thread et des affichages en console, dans mes souvenirs, il faut absolument utiliser System.err et non System.out (car system.out ne garantit pas l'ordre d'affichage...) mais peut être me tromps-je
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    "garantir l'ordre d'affichage" ?
    Dans la JVM Oracle out et err sont tous les deux initialisés à une instance PrintStream, qui synchronise toutes les demandent d'écriture pour ne pas se trouver à ce qu'un appel d'écriture soit mélangé à un autre.

    Je ne vois pas bien ce qu'on peut garantir de mieux au niveau de ces objets en utilisant des threads. Si plusieurs threads essaient de s'en servir out et err ne vont pas deviner comment grouper les affichages.

    À la rigueur on peut avoir des problèmes quand on utilise à la fois out et err avec des threads, l'un et l'autre risquant de s'afficher dans des ordres aléatoires car les flux dans lesquels ils écrivent s'affichent finalement au même endroit. Or, si on ne veut utiliser que l'un et pas l'autre, on ne peut jamais garantir que err ne soit pas utilisé : la JVM y écrit la stacktrace des exceptions non catchées dans un thread, et pas mal de bibliothèques écrivent aussi dessus. Ce n'est pas le cas de out, donc dans ce cas, il suffit de ne pas s'en servir.
    Mais c'est un peu boîteux comme raisonnement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    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
    La seule différence majeure entre err et out tient à l'OS:

    avec out, les données ne sont flushée (vers l'affichage) que quand le buffer est plein ou quand on à un \n dans le flux. Ainsi

    System.out.print("hello ");
    Thread.sleep(5000);
    System.out.println("world");
    n'affichera que "Hello world" d'un seul coup et seulement après 5 secondes, le même code avec err affiche Hello, puis complète au bout de 5 secondes avec world.

  13. #13
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 072
    Points : 7 974
    Points
    7 974
    Par défaut
    Ouais il me semblait bien, merci _tchize.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problème d'utilisation des threads dans mes servlets
    Par casho dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 08/08/2007, 20h34
  2. problème de priorité des threads
    Par wauant dans le forum C
    Réponses: 4
    Dernier message: 18/04/2007, 09h51
  3. problème de priorité des threads
    Par wauant dans le forum Développement
    Réponses: 1
    Dernier message: 12/04/2007, 11h49
  4. [Problème de Compréhension] Les Threads
    Par Identifiant dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 29/12/2006, 21h00
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 23h07

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