java concurrency:несколько-производитель один-потребитель

У меня есть ситуация, когда разные потоки заполняют очередь (производителей)и один потребитель извлекает элемент из этой очереди. Моя проблема в том, что когда один из этих элементов извлекается из очереди, некоторые из них пропускаются (отсутствует сигнал?). Код производителя — :

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. Есть идеи, как это исправить?

5
задан Randomize 4 April 2012 в 07:25
поделиться