2012-05-19 15 views
9

में सिंक्रनाइज़ किए गए संदर्भ से Thread.sleep() को कॉल करना मैंने पढ़ा है कि Thread.sleep() वर्तमान में चल रहे समय के लिए चल रहे थ्रेड को रोक देगा जिसके बाद यह चलने योग्य राज्य पर वापस जाने के लिए प्रतीक्षा कर रहा है।जावा

इसके अलावा, अगर synchronized संदर्भ से कहा जाता है, तो sleep() उस लॉक को जारी नहीं करता है। तो मैं सोच रहा था कि यह लॉक कब जारी करेगा। यदि थ्रेड, नींद डाला जाता है, तो कभी भी दौड़ने का मौका नहीं मिलता है, इसलिए यह हमेशा लॉक को अपने साथ रखेगा और फिर अन्य धागे सिंक्रनाइज़ किए गए तरीकों/ब्लॉक में कैसे प्रवेश करेंगे।

मुझे यकीन नहीं है कि मैं वैध प्रश्न पूछ रहा हूं या नहीं। लेकिन कृपया मेरी मदद करो।

उत्तर

16

तो मैं सोच रहा था कि यह लॉक जारी करेगा।

यह synchronized ब्लॉक से बाहर निकलने पर लॉक जारी करेगा, और पहले नहीं।

यदि थ्रेड, नींद डालें, कभी भी दौड़ने का मौका नहीं मिलता है, तो यह हमेशा लॉक को अपने साथ रखेगा और फिर अन्य धागे सिंक्रनाइज़ किए गए तरीकों/ब्लॉक में कैसे प्रवेश करेंगे।

केवल, अन्य थ्रेड कोड है कि एक ही वस्तु कि नींद धागे पर सिंक्रनाइज़ होती है में प्रवेश करने में सक्षम नहीं होगा।

संक्षेप में, को synchronized ब्लॉक से कॉल करना संभव नहीं है।

+2

वास्तव में, 'Thread.sleep()' को कॉल करना शायद एक अच्छा विचार नहीं है। अगर ऐसा कुछ है जो आप अभी कर सकते हैं, तो आपको इसे अभी करना चाहिए। यदि आपको कुछ भी करने से पहले कुछ इंतजार करना है, तो आपको सोने के बजाए उस चीज़ की प्रतीक्षा करनी चाहिए। –

+2

@ डेविडस्वार्टज़: मैं सहमत हूं। हालांकि 'Thread.sleep()' के लिए वैध उपयोग हैं, लेकिन अक्सर इसका उपयोग किया जाता है जहां यह नहीं होना चाहिए। – NPE

+0

अच्छी तरह से समझाया, लेकिन कह रहा है "सारांशित करने के लिए, एक सिंक्रनाइज़ ब्लॉक से Thread.sleep() को कॉल करना शायद एक अच्छा विचार नहीं है।" बहुत दूर जा रहा है। कभी-कभी आप प्रतीक्षा करना और ताला रखना चाहते हैं। – Jesus

13

यदि आप का उपयोग Thread.sleep के बजाय करते हैं, तो सिंक्रनाइज़ किए गए ब्लॉक से लॉक जारी किया जाएगा।