आप wait
/notify
(Monitor.Wait
के बराबर और Monitor.Pulse
) के बजाय का उपयोग कर विचार किया है?
आप यह देखने के लिए थोड़ा सा जांच करना चाहते हैं कि वास्तव में को की आवश्यकता है (दौड़ की स्थिति से बचने के लिए) लेकिन इसे काम करना चाहिए।
अन्यथा, CountDownLatch
जैसे कुछ भी आप जो चाहते हैं वह कर सकते हैं।
संपादित करें: मैंने केवल यह देखा है कि CountDownLatch
मूल रूप से "एकल उपयोग" है - आप बाद में गिनती को रीसेट नहीं कर सकते, जहां तक मैं देख सकता हूं। आप इसके बजाय Semaphore
चाह सकते हैं। समय समाप्त के साथ प्रतीक्षा करने के लिए tryAcquire
इस तरह का उपयोग करें:
if (semaphore.tryAquire(5, TimeUnit.SECONDS)) {
...
// Permit was granted before timeout
} else {
// We timed out while waiting
}
ध्यान दें कि यह ManualResetEvent
के विपरीत है कि tryAcquire
करने के लिए प्रत्येक सफल कॉल परमिट की संख्या कम हो जाएगा - तो अंततः वे फिर से बाहर चलाने के लिए होगा। आप इसे ManualResetEvent
के साथ स्थायी रूप से "सेट" नहीं कर सकते हैं। (यह CountdownLatch
के साथ काम करेंगे, लेकिन फिर तुम नहीं "रीसेट" हो सकता है यह :)
स्रोत
2010-09-02 10:00:05
लेकिन टाइमआउट पहलू के बारे में क्या? काउंटरडाउनलैच के दस्तावेज़ में मैंने जो पढ़ा है, उससे ऐसा लगता है कि टाइमआउट मान नहीं है जिसे मैं अंतराल के अंत तक चलने से पहले रोक या रोक सकता हूं। मैं एक जावा टाइप करना चाहता हूं जिसका उपयोग मैं टाइमआउट के लिए प्रतीक्षा करने के लिए कर सकता हूं, और मैन्युअल ओवरराइड की तरह टाइमआउट खत्म होने से पहले इसे अवरुद्ध किया जा सकता है। इसके अलावा, हैलो श्री स्कीट! आप कैसे हैं? आपको शायद यह बहुत कुछ मिल जाए, लेकिन आपकी पुस्तक बहुत बढ़िया है! – Orca
@ वोल्टनेट: आप 'प्रतीक्षा (लंबी टाइमआउट, टाइमयूनीट यूनिट)' कॉल करेंगे - जो दी गई टाइमआउट अवधि के लिए अवरुद्ध होगा * या * अगर लौच 0 पर गिना जाता है तो पहले वापस लौटें। आपको खुशी है कि आपको पुस्तक पसंद है :) –
Yup , समाधान को खूबसूरती से काम करना चाहिए क्योंकि मेरे पास केवल एक वस्तु है जो किसी भी समय प्रतीक्षा कर रही है। धन्यवाद, श्री जॉन स्कीट। – Orca