2011-02-08 6 views
8

हम एक ही ब्लॉकिंग विधि में कुछ कोड लिख रहे हैं, जो एकाधिक, धीमी तृतीय पक्ष सेवाओं को असीमित रूप से कॉल करता है। ये async कॉल कोड में लिपटे हैं जो एक ही इंटरफेस विधि को लागू करते हैं। हम एसिंक कॉल को आग लगाना चाहते हैं और जब तक कि वे हमारी ब्लॉकिंग विधि कॉल वापस करने से पहले वापस लौटे, तब तक प्रतीक्षा करें।एसिंक्रोनस जावा कॉल के समूह के लिए प्रतीक्षा करने का हल्का तरीका

मुझे उम्मीद है कि यह स्पष्ट है!

क्या इसे लागू करने के लिए एक उपयुक्त डिजाइन पैटर्न/लाइब्रेरी है ... यह एक काफी आम पैटर्न होना चाहिए। अग्रिम में धन्यवाद।

उत्तर

9

आप CountDownLatch का उपयोग एसिंक कॉल की संख्या के साथ शुरू किया जा सकता है और प्रत्येक एसिंक हैंडलर लच को कम करता है। "बाहरी" विधि अवरुद्ध बस पूर्ण उलटी गिनती के लिए "का इंतजार है" होता है, उदाहरण के लिए:

// Untested, Java pseudocode... 
public void awaitAllRemoteCalls() { 
    final CountDownLatch allDoneSignal = new CountDownLatch(N); 
    // For each remote N calls... 
    thirdPartyAsyncCall.call(new AsyncHandler(Object remoteData) { 
     // Handle the remote data... 
     allDoneSignal.countDown(); 
    }); 
    allDoneSignal.await(); 
} 
2

मुझे यकीन है कि तुम कैसे कार्य कर रहे होते नहीं हूँ, लेकिन मैं अधिमानतः द्वारा जो कुछ भी async कार्य शुरू होता है होगा (Executor का उपयोग करके) शुरू करने वाले प्रत्येक कार्य के लिए Future<?> वापस करें। तो फिर तुम बस इसे get() बुला के माध्यम से एक Collection में सभी Future<?> रों रख दिया और पुनरावृति पूरे करने होंगे:

List<Future<?>> futures = startAsyncTasks(); 
for (Future<?> future : futures) { 
    future.get(); 
} 
// all async tasks are finished 

मैं अपवाद get() यहाँ से निपटने के बाहर छोड़ दिया गया है, लेकिन है कि आम विचार है।