Farklı iş parçacıklarının bir kuyruğu (üretici) ve bir tüketiciyi bu sıradan almasını sağlayan bir durum var. Benim sorunum, bu elemanlardan biri sıradan alındığında bazı cevapsız (eksik sinyal?).java eşzamanlı: çok üretici bir tüketici
class Producer implements Runnable {
private Consumer consumer;
Producer(Consumer consumer) { this.consumer = consumer; }
@Override
public void run() {
consumer.send("message");
}
}
ve oluşturdukları ve birlikte çalıştırılır: üreticileri kodudur
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 20; i++) {
executor.execute(new Producer(consumer));
}
Tüketici kodudur:
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++;
}
}
}
}
}
kod çalıştırıldığında bazen 20 element eklendi olsun ve 20 alındı, ancak diğer durumlarda alınan öğeler 20'den küçüktür. Herhangi bir fikrin nasıl düzeltileceği.
Düşük seviyeli senkronizasyon yapılarının tuhaf bir karışımını ('wait',' notify') ve yüksek seviyeli ('ConcurrentLinkedQueue',' ExecutorService') kullanıyorsunuz. Birini veya diğerini kullanın! – artbristol
Yaptım ama her iki durumda da aynı sorun var – Randomize
Aslında Tüketici'yi çalıştıran kodu göremiyorum. – dhblah