यह प्रश्न this question में वर्णित समस्या (और हल) की एक और विशेष मामला है।जावा: इसे ऊपर/जोड़ते समय सूची से तत्वों को कैसे हटाएं
मेरे पास दो विधियां हैं, रोकें और हटाएं (सर्वर ऑब्जेक्ट सर्वर) और एक करीबी() विधि। बाद में सभी सर्वर बंद करना चाहिए और उन्हें सर्वर सूची से हटा देना चाहिए। इस रूप में,
public void closeCurrentlyOpen() {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
यह काम नहीं करेगा: सूची
List<ServerObject> server.
के रूप में परिभाषित किया गया है मैं closeCurrentlyOpen में stopAndRemove से लगभग एक ही कोड है नहीं करना चाहते, तो मैं कुछ ऐसा करना चाहते हैं एक ConcurrentModificationException का कारण बन जाएगा। मैं इस सूची
List<ServerObject> copyList = new ArrayList<ServerObject>(this.servers);
की एक प्रतिलिपि बनाने और उपयोग करें कि foreach पाश के लिए सूची के रूप में करने की कोशिश की। लेकिन फिर यह संभव हो सकता है कि एक अन्य थ्रेड सर्वर सूची में सर्वर को जोड़ता है, जबकि मैं कॉपीलिस्ट पर पुनरावृत्ति कर रहा हूं लेकिन बंद करें वर्तमान में ओपेन को एक एम्प्पी सूची में परिणाम माना जाता है। addServerToList विधि के रूप में सर्वर-सूची में समन्वयित किया जाता कर इस
public void closeCurrentlyOpen() {
synchronized(this.servers) {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
}
संशोधनों के साथ समस्या का समाधान होगा। लेकिन फिर मैं स्टॉप एंड्रॉम विधि में कोड को सिंक्रनाइज़ नहीं कर सकता जो आवश्यक है अगर इसे सीधे कहा जाता है।
मुझे लगता है कि इन तीन तरीकों के डिजाइन को शायद एक वर्कओवर की आवश्यकता है। कोई विचार?
मैं बहुत किया है ... रोकने के पाश से सभी तत्वों को रोकने,() सभी को दूर करने के तो list.clean। हां, "और" यहां कोड गंध है। मैंने इसे इस नाम में उदाहरण दिया है इसलिए मुझे यह वर्णन करने की आवश्यकता नहीं है कि मैं क्या करता हूं। – Arvodan