मेरी एक ऐसी स्थिति है जहां विभिन्न धागे एक कतार (उत्पादक) को पॉप्युलेट करते हैं और एक उपभोक्ता इस कतार से तत्व पुनर्प्राप्त करता है। मेरी समस्या यह है कि जब इन तत्वों में से एक को कतार से पुनर्प्राप्त किया जाता है तो कुछ याद किया जाता है (गायब सिग्नल?)। उत्पादकों कोड है:जावा समेकन: बहु-निर्माता एक उपभोक्ता
class Producer implements Runnable {
private Consumer consumer;
Producer(Consumer consumer) { this.consumer = consumer; }
@Override
public void run() {
consumer.send("message");
}
}
और वे बनाया है और साथ चलाए जा रहे हैं:
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 20; i++) {
executor.execute(new Producer(consumer));
}
उपभोक्ता कोड है:
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++;
}
}
}
}
}
जब कोड चलता है मैं कभी कभी 20 तत्वों को जोड़ा हो और 20 पुनर्प्राप्त, लेकिन अन्य मामलों में पुनर्प्राप्त तत्व 20 से कम हैं। किसी भी विचार को ठीक करने के लिए कैसे?
आप निम्न-स्तरीय सिंक्रनाइज़ेशन संरचनाओं ('प्रतीक्षा', 'सूचित करें') और उच्च-स्तरीय वाले (' ConcurrentLinkedQueue', 'execorService') के अजीब मिश्रण का उपयोग कर रहे हैं। एक या दूसरे का प्रयोग करें! – artbristol
मैंने यह किया लेकिन दोनों मामलों में मुझे एक ही समस्या है – Randomize
मैं वास्तव में उपभोक्ता चलाता कोड नहीं देख सकता। – dhblah