मैं अपने कार्यक्षेत्र द्वारा लौटाए गए फ़्यूचर्स ऑब्जेक्ट्स की एक सूची प्रबंधित करना चाहता हूं।
मैंने इसजावा थ्रेड - अजीब Thread.interrupted() और future.cancel (सत्य) व्यवहार
List<Future<String>> list
void process(ProcessThis processThis) {
for (...) {
Future<String> future = taskExecutor.submit(processThis);
list.add(future)
}
}
void removeFutures() {
for(Future future : list) {
assert future.cancel(true);
}
ProcessThis की तरह कुछ एक काम है कि Thread.interrupted के लिए लागू करता है प्रतिदेय < स्ट्रिंग> और चेक() की स्थिति
public String call() {
while (true) {
if (Thread.interrupted()) {
break;
}
doSomething();
}
}
अब समस्या यह है है कि केवल के एक सबसेट समवर्ती धागे 'सत्य' लौट रहे हैं जब Thread.interrupted() कहा जाता है।
हटाए गए फ्यूचर्स() में दिए गए हर क्षेत्र को हटाए गए भविष्य के लिए सत्य लौटाता है (मैंने जांच की है() और पूर्ण() है।
बाधित होने वाली थ्रेड की संख्या यादृच्छिक है। 15 से अधिक चलने वाले थ्रेड कभी-कभी 13 बाधित होते हैं, कभी-कभी 2 ...
मैं वास्तव में समझ नहीं पा रहा हूं कि समस्या कहां है। अगर मैं भविष्य को कॉल करता हूं। (सच) और यह सच हो जाता है ... और फिर मैं Thread.interrupted (इसे केवल एक बार कहा जाता है) की जांच करता हूं, मुझे उम्मीद है इस रूप में अच्छी तरह से सच लौटने के लिए।
मैं क्या याद आ रही है की कोई भी विचार?
मैं निर्माण जावा 1.6.0_02-B05 पर हूँ
आपकी प्रतिक्रिया के लिए धन्यवाद। ऐसा करने का क्या मतलब है? यदि Thread.interrupted() सत्य लौटाता है तो मैं चक्र चक्र तोड़ता हूं और मैं मूल रूप से धागे को मारता हूं। समस्या यह है कि कभी-कभी Thread.interrupted() 'झूठा' देता है भले ही संबंधित भविष्य.cancel (सत्य) सच हो। आपके द्वारा संपादित की गई रेखा उस समय तक भी नहीं पहुंच सकती है। – marts
फिर बाधा झंडा शायद 'doSomething()' में कहीं खो गया है (इसी कारण से - कुछ ध्वज को रीसेट करता है और इसमें पुनर्स्थापित नहीं होता है)। यही है, मेरे उत्तर में नमूना एक बुनियादी सिद्धांत है जिसका उपयोग खोए गए इंटरप्ट्स – axtavt
से बचने के लिए किया जाना चाहिए यदि ऐसा है ('खोए गए इंटरप्ट्स से बचें') तो क्या मैं सिर्फ Thread.currentThread() की तरह कुछ उपयोग नहीं कर सकता। IsInterrupted() के बजाय हर बार जब मैं Thread.interrupted() का उपयोग करता हूं तो इंटरप्ट स्थिति को पुनर्स्थापित करना पड़ता है। (बीटीडब्ल्यू के साथ एक बग है: http://stackoverflow.com/questions/2012259/) मैं कुछ करने में बाधा स्थिति से निपट नहीं रहा हूं। – marts