У меня есть ситуация, когда разные потоки заполняют очередь (производителей)и один потребитель извлекает элемент из этой очереди. Моя проблема в том, что когда один из этих элементов извлекается из очереди, некоторые из них пропускаются (отсутствует сигнал?). Код производителя — :
class Producer implements Runnable {
private Consumer consumer;
Producer(Consumer consumer) { this.consumer = consumer; }
@Override
public void run() {
consumer.send("message");
}
}
, и они создаются и запускаются с помощью :
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 20; i++) {
executor.execute(new Producer(consumer));
}
. Код потребителя — :
class Consumer implements Runnable {
private Queue<String> queue = new ConcurrentLinkedQueue<String>();
void send(String message) {
synchronized (queue) {
queue.add(message);
System.out.println("SIZE: " + queue.size());
queue.notify();
}
}
@Override
public void run() {
int counter = 0;
synchronized (queue) {
while(true) {
try {
System.out.println("SLEEP");
queue.wait(10);
} catch (InterruptedException e) {
Thread.interrupted();
}
System.out.println(counter);
if (!queue.isEmpty()) {
queue.poll();
counter++;
}
}
}
}
}
. Когда код запускается, я иногда получаю 20 добавленных элементов и 20 извлеченных, но в других случаях извлеченных элементов меньше 20. Есть идеи, как это исправить?