En attente de condition en Java

Je veux faire un thread qui met des valeurs à une file d'attente lorsqu'il se vide et attendre pour cette condition alors qu'il ne l'est pas. Voici le code que j'ai essayé de l'utiliser, mais il imprime

Adding new
Taking Value 1
Taking Value 2
Taking Value 3
Taking Value 4

De sorte qu'il fonctionne qu'une seule fois. Quel est le problème?

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class SO {
public String test;
public String[] list = new String[] {test};
public static void main(String[] args) {
new SO();
}
public SO() {
go();
}
BlockingQueue<String> qq = new LinkedBlockingQueue<String>();
class Producer implements Runnable {
public void run() {
try {
while (true) {
synchronized (this) {
while (qq.size() > 0)
wait();
System.out.println("Adding new");
qq.put("Value 1");
qq.put("Value 2");
qq.put("Value 3");
qq.put("Value 4");
}
}
} catch (InterruptedException ex) {}
}
}
class Consumer implements Runnable {
public void run() {
try {
while(true) {
System.out.println("Taking " + qq.take()+". "+String.valueOf(qq.size())+" left");
Thread.sleep(1000);
}
} catch (InterruptedException ex) {}
}
}
public void go() {
Producer p = new Producer();
Consumer c = new Consumer();
new Thread(p).start();
new Thread(c).start();
}
}
  • Au lieu d'utiliser wait/notify et associées à la taille de la logique de la vérification, vous pouvez faire cela (en fonction de si oui ou non vous voulez toujours avoir plus d'un objet dans la file d'attente à la consommation) à l'aide de LinkedBlockingQueue.put sur une file d'attente de capacité 1. Le put méthode javadocs dire: "Insère l'élément spécifié à la fin de cette file d'attente, en attendant, si nécessaire, de l'espace disponible."
InformationsquelleAutor Fluffy | 2010-02-28