इंटर-थ्रेड संचार में परेशानी हो रही है और पूरे स्थान पर "डमी संदेश" का उपयोग कर इसे हल किया गया है। क्या यह एक बुरा विचार है? संभावित समाधान क्या हैं?निर्माता-उपभोक्ता इंटर-थ्रेड संचार
उदाहरण समस्या मेरे पास है।
मुख्य धागा डेटाबेस में रिकॉर्ड को प्रोसेस करने और डालने के लिए धागा शुरू करता है। मुख्य धागा एक संभावित फ़ाइल को पढ़ता है और एक ब्लॉकिंगक्यू में एक के बाद एक रिकॉर्ड (ऑब्जेक्ट) रखता है। प्रोसेसिंग थ्रेड कतार से पढ़ता है और काम करता है।
मैं "प्रसंस्करण थ्रेड" को रोकने के लिए कैसे कहूं? कतार खाली हो सकती है लेकिन काम नहीं किया जाता है और मुख्य धागा या तो थ्रेड प्रसंस्करण के काम को समाप्त नहीं करता है और इसे बाधित नहीं कर सकता है।
तो प्रसंस्करण धागा
while (queue.size() > 0 || !Thread.currentThread().isInterrupted()) {
MyObject object= queue.poll(100, TimeUnit.MILLISECONDS);
if (object != null) {
String data = object.getData();
if (data.equals("END")) {
break;
}
// do work
}
}
// clean-up
synchronized queue) {
queue.notifyAll();
}
return;
और मुख्य थ्रेड करता
// ...start processing thread...
while(reader.hasNext(){
// ...read whole file and put data in queue...
}
MyObject dummy = new MyObject();
dummy.setData("END");
queue.put(dummy);
//Note: empty queue here means work is done
while (queue.size() > 0) {
synchronized (queue) {
queue.wait(500); // over-cautios locking prevention i guess
}
}
ध्यान दें कि प्रविष्टि ही लेन-देन में होना चाहिए और लेन-देन मुख्य थ्रेड से संभाला नहीं जा सकता।
ऐसा करने का बेहतर तरीका क्या होगा? (मैं सीख रहा हूँ और शुरू करने के लिए "इसे गलत तरीके से कर रही है" नहीं करना चाहती)
ठीक है। अगर मैं ऑब्जेक्ट्स के प्रकार के पास स्ट्रिंग फ़ील्ड नहीं रखता तो इसका उपयोग कैसे किया जा सकता है जिसका उपयोग आसानी से किया जा सकता है? क्या होगा यदि कोई पाठ मान्य डेटा हो और इसलिए जहर के बराबर हो सकता है? एक GUID का प्रयोग करें? –
आदर्श रूप से आप MyObject क्लास को बदल देंगे और एक विधि जोड़ना होगा() वहां। यह विधि कैसे निर्धारित करती है कि ऑब्जेक्ट एक जहरीला है या नहीं, यह एक साधारण बात हो सकती है जैसे कि संदेश शून्य, खाली है या संदेश स्पष्ट रूप से जहर के रूप में बनाया गया था। एक विचार MyObject को दो कार्यान्वयन के साथ एक इंटरफ़ेस होने के लिए दोबारा प्रतिक्रिया देना होगा, एक संदेश ऑब्जेक्ट जो हमेशा isPoison() विधि और एक जहर मैसेज में झूठी वापसी करता है, जो हमेशा सत्य लौटता है। लेकिन यह वास्तव में आप क्या कर रहे हैं इस पर निर्भर करता है, और आपके असली संदर्भ के बाद बेहतर समाधान मौजूद हो सकते हैं। –