2010-09-15 5 views
1

J'ai le code suivant qui récupère le premier élément d'une file d'attente seulement s'il a au moins 2 éléments. Pour une raison quelconque, il n'interroge pas le premier élément. Toutefois, si j'ajoute une instruction d'impression, l'impression et l'interrogation seront effectuées. La méthode est dans un thread, et il y a un autre thread ajoutant un élément à la file d'attente, ce thread lit dans la file d'attente.La file d'attente ne fonctionne pas avec le fil?

... 
public void run(){ 
    while(beginning){ 
     int size = queue.size(); 
     // adding this will cause the program to enter if below: System.out.println(size); 
     if(size > 1){ 
      System.out.println("data: " + queue.poll()); 
      beginning = false; 
     } 
    } 
} 
... 

Si l'instruction println est ajouté, il imprimera
....
données: données

Si l'instruction println est de retirer, il ne sera pas rien imprimer.

En fait, aussi longtemps que je mets quelque chose là-dedans, un Thread.sleep (1) ou une déclaration d'impression aléatoire, il interrogera les données et l'imprimer

Thanx pour toute entrée.

+0

duplication possible de [La boucle ne voit pas de valeur modifiée sans instruction d'impression] (http://stackoverflow.com/questions/25425130/loop-doesnt-see-changed-value-without-a-print-statement) – Boann

Répondre

1

Vous devez synchroniser sur l'objet de file d'attente:

public void run(){ 
    while(beginning){ 
     synchronized (queue) { 
      int size = queue.size(); 
      // adding this will cause the program to enter if below: System.out.println(size); 
      if(size > 1){ 
       System.out.println("data: " + queue.poll()); 
       beginning = false; 
      } 
     } 
    } 
} 

Cela permettra d'éviter vos multiples threads d'accéder à la file d'attente aux heures incorrectes.

Vous devrez également synchroniser le thread qui ajoute des éléments à la file d'attente d'une manière similaire.

0

Cela ressemble à un problème de synchronisation.

0

Vous devez faire attention à l'utilisation d'une ressource partagée entre les threads. Vous devriez envisager d'utiliser un verrou (jeton), l'acquérir avant d'accéder à la file d'attente et de la libérer après utilisation.

0

... Il s'est avéré que je devais synchroniser sur le thread pour le faire fonctionner car la file d'attente est implémentée par une liste chaînée.

Mais pourquoi une instruction d'impression le ferait-il fonctionner?