Я хотел бы иметь SynchronousQueue
, где я вставляю элементы из одного потока с помощью put()
, поэтому ввод блокируется, пока элемент не будет взят в другой поток.
В другом потоке я выполняю много вычислений и время от времени хочу проверить, доступен ли уже элемент, и использовать его. Но кажется, что isEmpty()
всегда возвращает true, даже если другой поток ожидает при вызове put()
.
Как, черт возьми, это возможно? Вот пример кода:
@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");
}
РЕДАКТИРОВАТЬ: Ни isEmpty (), ни peek () не работают, нужно использовать poll (). Спасибо!