2010-02-16 11 views
11

java.util.concurrent पैकेज और भविष्य इंटरफ़ेस के संदर्भ में मुझे नोटिस (जब तक कि मुझे गलत नहीं लगता) कि एक लंबा कार्य शुरू करने की क्षमता और क्वेरी पर क्वेरी करने में सक्षम होना प्रगति केवल स्विंगवर्कर कार्यान्वयन कक्षा के साथ आता है।भविष्य पर प्रगति प्राप्त करने की क्षमता <T> ऑब्जेक्ट

यह निम्नलिखित प्रश्न भीख माँगता:

वहाँ एक रास्ता है, एक गैर जीयूआई, गैर घुमाओ आवेदन में (इमेजिंग एक सांत्वना आवेदन) पृष्ठभूमि में एक लंबा काम शुरू करने और अन्य थ्रेड का निरीक्षण करने की अनुमति प्रगति ? ऐसा लगता है कि ऐसा कोई कारण नहीं है कि यह क्षमता स्विंग/जीयूआई अनुप्रयोगों तक सीमित क्यों होनी चाहिए। अन्यथा, एकमात्र उपलब्ध विकल्प, जिस तरह से मैं इसे देखता हूं, एक्जिक्यूटर्स सेवा :: सबमिट करना है जो एक भविष्य वस्तु देता है। हालांकि, बेस फ्यूचर इंटरफ़ेस प्रगति की निगरानी करने की अनुमति नहीं देता है।

+2

देखें http://stackoverflow.com/questions/2003354/how-can-i-report-progress-from-a-background-task – Mark

उत्तर

5

जाहिर है, भविष्य वस्तु केवल अवरुद्ध करने और परिणाम प्राप्त करने के लिए अच्छा होगा।

आपके द्वारा सबमिट किए जाने योग्य रनने योग्य या कॉल करने योग्य ऑब्जेक्ट को या तो यह प्रगति प्रदान करना होगा कि यह प्रगति कैसे प्रदान की जाए (प्रतिशत पूर्ण, प्रयासों की गिनती, स्थिति (enum?) आदि) और ऑब्जेक्ट को एपीआई कॉल के रूप में प्रदान करें, या कुछ लुकअप संसाधन में पोस्ट किया गया (मेमोरी मैप या डेटाबेस में आवश्यक होने पर)। सादगी के लिए मैं ऑब्जेक्ट को स्वयं पसंद करता हूं, खासतौर से जब आप ऑब्जेक्ट को ऑब्जेक्ट या ऑब्जेक्ट के संदर्भ में देखने के लिए एक हैंडल (आईडी) की आवश्यकता होती है।

इसका मतलब यह है कि आपके पास 3 धागे चल रहे हैं। वास्तविक कार्य के लिए 1, परिणाम के लिए प्रतीक्षा करते समय अवरुद्ध 1, और 1 जो एक निगरानी धागा है। अंतिम आवश्यकताओं को आपकी आवश्यकताओं के आधार पर साझा किया जा सकता है।

1

मैं उम्मीद कर रहा था कि क्लाइंट प्रोग्राम को ऑर्केस्ट्रेटिंग और सिंक्रनाइज़ करने के बारे में चिंता करने की आवश्यकता के बिना लंबे समय तक चलने वाले कार्य की प्रगति पर अद्यतन रहने के लिए एक मानक समवर्ती ढांचा तरीका था। मुझे लगता है किऔर get() विधियों के अतिरिक्त public short progress(); का समर्थन करने के लिए Future<T> इंटरफ़ेस का विस्तारित संस्करण हो सकता है।

public interface CanReportProgress { 
    public short progress(); 
} 

यही कारण है कि एक जाने के लिए परेशान करेगा का सवाल भीख माँगता: जाहिर progress() के कार्यान्वयन तो सीधे तो शायद Future<T>Future<T extends CanReportProgress> जहां CanReportProgress निम्नलिखित इंटरफेस है के रूप में निर्दिष्ट किया जाना आवश्यक होगा वस्तु मतदान करने की आवश्यकता होगी Future ऑब्जेक्ट के माध्यम से ऑब्जेक्ट को प्रगति प्राप्त करने के लिए स्वयं को कॉल करने के विरोध में। मुझे नहीं पता। मुझे इसे और सोचना होगा। यह तर्क दिया जा सकता है कि यह वर्तमान अनुबंध/अर्थशास्त्र के करीब है जिससे Callable ऑब्जेक्ट को क्लाइंट प्रोग्रामर द्वारा ExecutorService::submit/execute पर कॉल करने के बाद फिर से एक्सेस नहीं किया गया है।

+0

मुझे जेडीके बॉक्स से कुछ भी पता नहीं है जो आपकी मदद करेगा स्विंगवर्कर (1.6 जेडीके का हिस्सा) लेने के अलावा एक गैर-स्विंग संस्करण कैसे दिख सकता है इसका एक उदाहरण के रूप में। यह RunnableFuture और getProgress() (ईवेंट अधिसूचना के साथ) का उपयोग करता है)।यह मेरे लिए एक ठोस शुरुआत की तरह लगता है, क्योंकि यह एक ज्ञात मात्रा है और वर्षों से अधिक दिमाग से विकास/परीक्षण में है। शुभकामनाएँ। – Matt

+3

ध्यान दें कि भविष्य में टी वापसी मूल्य की कक्षा के लिए खड़ा है। कार्य पूरा होने तक आप टी तक नहीं पहुंच सकते हैं। इसलिए टी को CanReportProgress को विस्तारित करना व्यर्थ है। – Anderson

1

मेरे मामले में मैंने प्रक्रिया के ऑब्जेक्ट्स के साथ हैशसेट पास किया, विधि के पैरामीटर के रूप में, जिसे कॉलिंग क्लास में इंस्टेंस चर के रूप में बनाया गया था। जब एसिंक्रोनस विधि प्रसंस्करण के बाद ऑब्जेक्ट को हटा देती है तो कॉलिंग विधि में शेष मानचित्र का आकार पुनर्प्राप्त कर सकता है। संदर्भ में वस्तुओं को सामान्य रूप से पास करने में समस्या समस्या हल करती है।