Je voudrais avoir un SynchronousQueue
où j'insère des éléments d'un fil avec put()
, ainsi l'entrée est bloquée jusqu'à ce que l'élément soit pris dans un autre fil.BlockingQueue: put() et isEmpty() ne fonctionnent pas ensemble?
Dans l'autre thread j'effectue beaucoup de calculs et de temps en temps je veux vérifier si un élément est déjà disponible, et le consommer. Mais il semble que isEmpty()
retourne toujours vrai, même si un autre thread attend à l'appel put()
.
Comment diable est-ce possible? Voici l'exemple de code:
@Test
public void testQueue() throws InterruptedException {
final BlockingQueue<Integer> queue = new SynchronousQueue<Integer>();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (!queue.isEmpty()) {
try {
queue.take();
System.out.println("taken!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// do useful computations here (busy wait)
}
}
});
t.start();
queue.put(1234);
// this point is never reached!
System.out.println("hello");
}
EDIT: Ni isEmpty(), ni coup d'oeil() travail, on doit utiliser poll(). Merci!
oh mon, j'aurais dû lire le javadoc ... J'ai essayé à la fois peek() et isEmpty(), et les deux retournent toujours null ou true. – martinus