współbieżność java: multi-producent jeden konsument
Mam sytuację, w której różne wątki zapełniają kolejkę (producentów) i jeden konsument pobiera element z tej kolejki. Mój problem polega na tym, że gdy jeden z tych elementów jest pobierany z kolejki, niektóre z nich zostają pominięte (brak sygnału?). Kod producenta to:
<code>class Producer implements Runnable { private Consumer consumer; Producer(Consumer consumer) { this.consumer = consumer; } @Override public void run() { consumer.send("message"); } } </code>
i są tworzone i uruchamiane z:
<code>ExecutorService executor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 20; i++) { executor.execute(new Producer(consumer)); } </code>
Kod konsumenta to:
<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>
Kiedy kod jest uruchamiany, otrzymuję czasem 20 elementów dodanych i 20 pobranych, ale w innych przypadkach odzyskane elementy są mniejsze niż 20. Każdy pomysł, jak to naprawić?