Ho una situazione in cui thread diversi popolano una coda (produttori) e un utente recupera elemento da questa coda. Il mio problema è che quando uno di questi elementi viene recuperato dalla coda, alcuni vengono persi (segnale mancante?). Il codice di produttori è:java simultane: multi-producer one-consumer
class Producer implements Runnable {
private Consumer consumer;
Producer(Consumer consumer) { this.consumer = consumer; }
@Override
public void run() {
consumer.send("message");
}
}
e si sono creati e correre con:
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 20; i++) {
executor.execute(new Producer(consumer));
}
Codice del consumo è:
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++;
}
}
}
}
}
Quando viene eseguito il codice ottengo a volte 20 elementi aggiunti e 20 recuperati, ma in altri casi gli elementi recuperati sono inferiori a 20. Qualche idea su come risolverli?
Si sta utilizzando una strana combinazione di costrutti di sincronizzazione di basso livello ('wait',' notify') e quelli di alto livello ('ConcurrentLinkedQueue',' ExecutorService'). Usa l'uno o l'altro! – artbristol
L'ho fatto ma in entrambi i casi ho lo stesso problema – Randomize
Non riesco a vedere il codice che esegue effettivamente Consumer. – dhblah