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 :

Java et multithreading


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut Java et multithreading
    Bonsoir,
    J'ai besoin d'aide concernant un programme qui simule une conférence ( avec 3 orateurs et un président, chacun avec 2 discours, chaque discours contient 3 phrases ) que je dois synchroniser par rapport à un objet ( mégaphone ). Deux situations sont à simuler :
    1- la première consiste à ce que le président ne commence à parler qu'après les 3 autres orateurs aient terminé tous leurs discours ( et peu importe l'ordre selon lequel ils passent)

    2- La deuxième et c'est là où je bloque, consiste à ce que le président commence en premier par uniquement le 1er discours ( ouverture ) , céder la parole aux autres orateurs ( et là encore , ces autres orateurs peuvent avoir n'importe quel ordre ) et finisse par son 2eme ( de clôture).

    Voici mon code pour le 1er scénario:

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    public class MegaPhone  {
     
     
    	 MegaPhone mph;
     
     
     
    	synchronized void parler( int NumeroDiscours, String qui, Thread t){
     
    		System.out.println(qui+"va commencer son discours"+ NumeroDiscours);
     
    		for(int i=1 ; i<3 ; i++){
    			System.out.println(qui+"dit phrase"+ i + "de son discours " +NumeroDiscours);
     
     
    		}
    		System.out.println(qui +"a terminé son discours "+ NumeroDiscours);
     
     
    		try {
    			Thread.sleep(2000);
    			System.out.println("pause...");
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	}
     
     
     
     
     
     
    }
     
     
    public class Orateur extends Thread {
     
    	String nom;
    	MegaPhone mph;
     
     
    	public Orateur(String nom,  MegaPhone mph){
    		this.nom=nom;
    		this.mph=mph;
    	}
     
     
     
    	public void run() {	
    		for(int i=1; i<=2;i++)
    		{
    		mph.parler(i, nom, this);
     
    		}
    	}
    }
     
     
     
    public class Assemblee {
    	MegaPhone mph;
    	String nom;
     
     
    	public static void main(String[] args)  {
    		// TODO Auto-generated method stub
    		MegaPhone mph=new MegaPhone();
    		  Orateur or1 = new Orateur("Orateur 1",mph);
    		  Orateur or2 = new Orateur("Orateur 2",mph);
    		  Orateur or3 = new Orateur("Orateur 3",mph);
    		// ajout president
    		  Orateur pres=new Orateur("président",mph);
     
    		  or1.start();
    		  or2.start();
    		  or3.start();
     
    		  try {
    			or1.join();
    			or2.join();
    			or3.join();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		 pres.start();
     
    	}
     
     
     
     
     
    	}
    Merci de bien vouloir m'aider, je ne sais pas grand chose sur le multithreading...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Dis toi que la seule différence entre cas 1 et cas 2 ce sont:

    le moment où les orateurs commencent (donc au final le moment où on démarre leurs threads): après la première phrase
    le président parle en deux fois (donc au final deux parler distincts dans le code)

  3. #3
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Dans le code de ton orateur, ajouter un booléen pour savoir si c'est le président. Si c'est le président, il devra attendre en boucle tant que les autres n'ont pas terminés.
    Si c'est un orateur il doit attendre que le président ait terminé.
    Ou surcharge ta classe Orateur pour créer une classe Président avec un fonctionnement particulier. Je détaille :

    Le main change peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    		MegaPhone mph=new MegaPhone();
    		  Orateur or1 = new Orateur("Orateur 1",mph);
    		  Orateur or2 = new Orateur("Orateur 2",mph);
    		  Orateur or3 = new Orateur("Orateur 3",mph);
    		// ajout president
    		  Orateur pres=new Orateur("président",mph);
     
    		  pres.start(); // lancement de tous les discours
    		  or1.start();  
    		  or2.start();
    		  or3.start();
    Mais il faudra changer ton Mégaphone pour qu'il puisse gérer un "flag" ou un compteur.
    Je te conseille deux compteur (qui devront être thread safe):
    - compteur président : 0 au début, incrémenté de 1 lors du premier discours du président, décrémenté de 1 lors du deuxième
    - compteur orateur : 0 au début, incrémenté de 1 lors du premier discours d'un orateur, décrémenté de 1 lors du deuxième discours d'un orateur

    Un orateur ne peut commencer que si le compteur du président est supérieur à 0
    Un président ne peut continuer que si le compteur orateur est à 0

    Pour ton compteur, tu peux utiliser un entier classique, ou regarder dans l'API ce qu'est un AtomicInteger


    Méthode moche mais qui marche toujours sans race condition : tu passes à ton President la liste de tous les threads Orateurs non démarrés, le président fait son discours, il lance les orateur et il fait un join sur chaque Thread de la liste...

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    Merci beaucoup pour vos réponses, j'essaierai ce que vous m'avez proposé et puis je posterai mon avancement ici.

Discussions similaires

  1. java multithreading dans une matrice
    Par wildthing dans le forum Langage
    Réponses: 1
    Dernier message: 21/05/2009, 11h42
  2. [client serveur multithread]Java
    Par Zay dans le forum Développement
    Réponses: 4
    Dernier message: 12/04/2007, 23h06

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