2011-01-09 21 views
25

का सिंक संस्करण जावा में एक एसिंक्रोनस विधि का सिंक्रोनस संस्करण बनाने का सबसे अच्छा तरीका क्या है?async विधि

आप इन दो तरीकों के साथ एक वर्ग है कहो:

asyncDoSomething(); // Starts an asynchronous task 
onFinishDoSomething(); // Called when the task is finished 

कैसे आप एक तुल्यकालिक doSomething() कि वापस नहीं करता है जब तक काम समाप्त हो गया है लागू होगा?

उत्तर

63

CountDownLatch पर एक नज़र डालें।

private CountDownLatch doneSignal = new CountDownLatch(1); 

void main() throws InterruptedException{ 
    asyncDoSomething(); 
    //wait until doneSignal.countDown() is called 
    doneSignal.await(); 
} 

void onFinishDoSomething(){ 
    //do something ... 
    //then signal the end of work 
    doneSignal.countDown(); 
} 

तुम भी समान व्यवहार इस तरह CyclicBarrier 2 साथ पार्टियों का उपयोग कर प्राप्त कर सकते हैं:

private CyclicBarrier barrier = new CyclicBarrier(2); 

void main() throws InterruptedException{ 
    asyncDoSomething(); 
    //wait until other party calls barrier.await() 
    barrier.await(); 
} 

void onFinishDoSomething() throws InterruptedException{ 
    //do something ... 
    //then signal the end of work 
    barrier.await(); 
} 

तुम स्रोत-कोड पर नियंत्रण है, तो आप कुछ इस तरह से व्यवहार का अनुकरण वांछित तुल्यकालिक कर सकते हैं asyncDoSomething() का, हालांकि, मैं इसके बजाय Future<Void> ऑब्जेक्ट को वापस करने के लिए इसे फिर से डिजाइन करने की अनुशंसा करता हूं। ऐसा करने से आप इस तरह की आवश्यकता होने पर आसानी से एसिंक्रोनस/सिंक्रोनस व्यवहार के बीच स्विच कर सकते हैं:

void asynchronousMain(){ 
    asyncDoSomethig(); //ignore the return result 
} 

void synchronousMain() throws Exception{ 
    Future<Void> f = asyncDoSomething(); 
    //wait synchronously for result 
    f.get(); 
} 
+1

+1 इस तरह के विस्तृत उत्तर, रॉडियन के लिए धन्यवाद! – hpique

+1

मेरी इच्छा है कि मैं आपको 1 से अधिक वोट दे सकता हूं। भविष्य

+0

@rodion की उत्कृष्ट अनुशंसा अगर मैं लूप के अंदर काउंटरडाउनलैच का उपयोग करता हूं, और लूप के भीतर इसे तुरंत चालू करता हूं, तो क्या यह लूप को अगले पुनरावृत्ति को निष्पादित करने से रोक देगा जब तक कि पुनरावृत्ति का कार्य नहीं किया जाता है या यह फिर से जारी रहेगा? अगर मेरा प्रश्न स्पष्ट नहीं है तो कृपया मुझे बताएं। – Aaron

संबंधित मुद्दे