Tôi có một tình huống mà các chủ đề khác nhau điền vào hàng đợi (nhà sản xuất) và một người tiêu dùng truy xuất phần tử từ hàng đợi này. Vấn đề của tôi là khi một trong những phần tử này được lấy ra từ hàng đợi, một số được bỏ qua (thiếu tín hiệu?). Mã nhà sản xuất là:java đồng thời: đa người sản xuất một người tiêu dùng
class Producer implements Runnable {
private Consumer consumer;
Producer(Consumer consumer) { this.consumer = consumer; }
@Override
public void run() {
consumer.send("message");
}
}
và họ được tạo ra và chạy với:
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 20; i++) {
executor.execute(new Producer(consumer));
}
đang tiêu dùng là:
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++;
}
}
}
}
}
Khi đang chạy tôi nhận được đôi khi 20 yếu tố gia tăng và 20 được truy xuất, nhưng trong các trường hợp khác, các phần tử được truy xuất nhỏ hơn 20. Bất kỳ ý tưởng nào để khắc phục điều đó?
Bạn đang sử dụng hỗn hợp lẻ của các cấu trúc đồng bộ hóa mức thấp ('wait',' notify') và các mức cao cấp ('ConcurrentLinkedQueue',' ExecutorService'). Sử dụng cái này hay cái kia! – artbristol
Tôi đã làm điều đó nhưng trong cả hai trường hợp tôi có cùng một vấn đề – Randomize
Tôi không thể thấy mã thực sự chạy Người tiêu dùng. – dhblah