concorrência simultânea: multi-produtor de um consumidor
Eu tenho uma situação em que diferentes threads preenchem uma fila (produtores) e um consumidor recupera o elemento dessa fila. Meu problema é que, quando um desses elementos é recuperado da fila, alguns são perdidos (falta de sinal?). O código dos produtores é:
<code>class Producer implements Runnable { private Consumer consumer; Producer(Consumer consumer) { this.consumer = consumer; } @Override public void run() { consumer.send("message"); } } </code>
e eles são criados e executados com:
<code>ExecutorService executor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 20; i++) { executor.execute(new Producer(consumer)); } </code>
Código do consumidor é:
<code>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++; } } } } } </code>
Quando o código é executado, às vezes consigo 20 elementos adicionados e 20 recuperados, mas em outros casos os elementos recuperados são menores que 20. Alguma idéia de como corrigir isso?