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 इस तरह के विस्तृत उत्तर, रॉडियन के लिए धन्यवाद! – hpique
मेरी इच्छा है कि मैं आपको 1 से अधिक वोट दे सकता हूं। भविष्य –
@rodion की उत्कृष्ट अनुशंसा अगर मैं लूप के अंदर काउंटरडाउनलैच का उपयोग करता हूं, और लूप के भीतर इसे तुरंत चालू करता हूं, तो क्या यह लूप को अगले पुनरावृत्ति को निष्पादित करने से रोक देगा जब तक कि पुनरावृत्ति का कार्य नहीं किया जाता है या यह फिर से जारी रहेगा? अगर मेरा प्रश्न स्पष्ट नहीं है तो कृपया मुझे बताएं। – Aaron