2010-04-04 1 views
0

Bonjour, Je travaille sur le problème du coiffeur qui dort. avec l'addition d'avoir un client prioritaire quand ils arrivent ils vont en première ligne et ils sont les prochains à se faire couper les cheveux.Les threads Java ne fonctionnent pas correctement avec la liste liée

J'utilise un linkedlist et si je vois un client prioritaire je le mets au début de la liste, si le client n'est pas prioritaire il va à la fin de la liste. alors j'appelle la méthode wantHaircut pour obtenir le premier élément de la liste. Mon problème est que les clients sont traités dans l'ordre où ils arrivent, et le client prioritaire doit attendre. voici le code où tout se passe. des idées que je fais mal? grâce

public void arrivedBarbershop(Customer c){ 

     if(waiting < numChairs && c.isPriority()){ 
      System.out.println("Customer " + c.getID() + ": is a priority customer - SITTING -"); 
      mutex.up();    
      customer_list.addFirst(c); 
     } 
     else if(waiting >= numChairs && c.isPriority()){ 
      System.out.println("Customer " + c.getID() + ": is a priority customer - STANDING -"); 
      mutex.up(); 
      customer_list.addFirst(c); 
     } 
     else if(waiting < numChairs && !c.isPriority()){ 
      waiting++; 
      System.out.println("Customer " + c.getID() + ": arrived, sitting in the waiting room"); 
      customer_list.addLast(c); 
      customers.up(); // increment waiting customers 

     } 
     else if(waiting >= numChairs && !c.isPriority()) { 

     System.out.println("Customer " + c.getID() + ": went to another barber because waiting room was full - " + waiting + " waiting"); 
     mutex.up(); 
     } 

     if(!customer_list.isEmpty()){ 
     this.wantHairCut(customer_list.removeFirst()); 
     } 

    } 

    public void wantHairCut(Customer c) { 
      mutex.up(); 
      barber.down(); // waits for being allowed in barber chair 
      System.out.println("Customer " + c.getID() + ": getting haircut"); 
      try { 
      /** haircut takes between 1 and 2 seconds **/ 
       Thread.sleep(Barbershop.randomInt(1, 2) * 1000); 
      } catch (InterruptedException e) { } 
      System.out.println("Barber: finished cutting customer " + c.getID() + "'s hair"); 
      c.gotHaircut = true;   
      cutting.up(); // signals cutting has finished 

      /** customer must pay now **/ 
      this.wantToCashout(c);   
    } 
+0

Qu'est-ce que c'est «numChairs»? – Roman

+0

c'est le nombre de chaises dans la salle d'attente. s'ils sont tous pris, le client part à moins qu'il ne soit un client prioritaire, alors il peut attendre debout. – user69514

+0

J'ai utilisé un vecteur au lieu d'une liste chaînée car les vecteurs sont thread-safe, mais j'ai toujours le même problème. Je ne sais pas ce que je fais de mal. – user69514

Répondre

1

vous devez utiliser les collections synchronisées:

Collections.synchronizedList(List<Object> list) 

cette méthode retourne Liste synchronisée instanse basée sur la liste des paramètres

+0

Je ne sais pas si je le fais mal, mais cela ne fonctionne pas non plus ... list = Collections.synchronizedList (customer_list); – user69514

+0

cela signifie seulement que l'erreur contient dans la logique – Frostman

+0

faites-vous ce que l'erreur logique est? Je n'arrive pas à comprendre. – user69514

0

Je suis sûr que l'erreur logique est ici:

if(waiting < numChairs && c.isPriority()){ 
     System.out.println("Customer " + c.getID() + ": is a priority customer - SITTING -"); 
     mutex.up();    
     customer_list.addFirst(c); 
    } 
    else if(waiting >= numChairs && c.isPriority()){ 
     System.out.println("Customer " + c.getID() + ": is a priority customer - STANDING -"); 
     mutex.up(); 
     customer_list.addFirst(c); 
    } 

Et oui, évitez de copier/coller la programmation !

+0

Je ne semble pas trouver quelque chose de mal avec le code ci-dessus .... – user69514

+0

@ user69514: absolument les mêmes blocs de code dans les deux parties de la construction if/else. – Roman

+0

ils sont censés faire la même chose. l'un imprimera en STANDING et l'autre SITTING. l'un est s'il y a plus de clients que de chaises, et l'autre s'il y a moins de clients que de chaises. Je ne vois pas comment cela fait que le programme ne fonctionne pas correctement ... – user69514

0

Chaque fois que vous modifiez votre liste, vous devriez probablement mettre ce code sur un bloc synchronisé.

Une façon de le faire:

synchronized(customer_list) { 
customer_list.addFirst(c); 
} 

Une autre, de sorte que vous n'avez pas à code dans tous les sens:

public synchronized void addCustomerAtStart(Customer c) { 
customer_list.addFirst(c); 
} 

puis remplacer cette fonction. Même chose lorsque vous effectuez customer.up(), il semble que la synchronisation soit également nécessaire, sinon vous risquez d'avoir beaucoup de comportements incohérents. Astuce: Si vous devez synchroniser des threads, vous pouvez jeter un oeil à CountDownLatch, très facile à utiliser, fonctionne solidement pour la synchronisation des threads. .

+0

cette solution ne fonctionnait pas non plus ... Je ne sais pas où est mon erreur ... – user69514

0

Votre code ajoute un client à la liste (début ou fin), puis supprime un client de la liste. La liste ne contient jamais qu'un client au maximum, les clients sont donc traités dans l'ordre dans lequel ils ont été ajoutés.

Questions connexes