2011-01-28 6 views
6

संभव डुप्लिकेट:
Are Thread.sleep(0) and Thread.yield() statements equivalent?जावा में Thread.yield() और Thread.sleep (0) के बीच क्या अंतर है?

मेरी समझ में, दोनों Thread.yield() और Thread.Sleep (0) सीपीयू rejudge जो धागा कुछ समय निर्धारण एल्गोरिदम द्वारा चलता है करने के लिए करना चाहिए ।

अंतर है:

  1. Thread.yield() अन्य धागे के कार्यकारी मौका देने के लिए है, लेकिन Thread.Sleep (0) नहीं है, यह सिर्फ सीपीयू है कि आप को पुनर्व्यवस्थित करना चाहिए बता दूँगा होगा वर्तमान धागे सहित कार्यकारी धागे।

  2. थ्रेड.इल्ड() केवल एक सलाह है जिसका अर्थ है कि इसे बिल्कुल स्वीकार नहीं किया जा सकता है, लेकिन Thread.sleep (0) मजबूती से पुनर्गठन करेगा।

क्या ऊपर दिए गए निष्कर्ष सही हैं?

+1

चूंकि ये विधि बहुत कार्यान्वयन पर निर्भर हैं, यह कहना मुश्किल है। आपको इन तरीकों के व्यवहार पर भरोसा नहीं करना चाहिए। उदाहरण के लिए यदि आपके पास एक लूप है जो थ्रेड.इल्ड() करता है तो यह समय के CPU 99% + को छोड़ नहीं देगा। ओएस के आधार पर Thread.sleep (0) 0.5 से 2 एमएस तक सो सकता है, सीपीयू को छोड़कर, लेकिन यह गारनेटेड नहीं है। –

उत्तर

-3

Thread.sleep() सिर्फ थ्रेड को रोक देगा और नियंत्रण को दूर नहीं करेगा। Thread.yield() थ्रेड को रोक देगा और अन्य धागे को चलाने की अनुमति देगा। यदि कोई थ्रेड की आवश्यकता नहीं है, तो मूल धागा तुरंत फिर से शुरू हो जाएगा।

+3

गलत, मुझे लगता है। Thread.sleep() रनिंग स्थिति से थ्रेड ले जाएगा, और शेड्यूलर को चलने के लिए एक और रननेबल थ्रेड स्विच करने की अनुमति देगा (जैसा थ्रेड.इल्ड() होगा। थ्रेड, हालांकि, किसी भी ताले रखता है। –

2

Thread.Sleep() थोड़ा बड़ा ओवरहेड है क्योंकि यह एक ऐसी प्रणाली बनाता है जिसमें कुछ प्रकार का टाइमर शामिल होता है जो प्रक्रिया को जगाएगा। (मूल रूप से कार्यान्वयन पर निर्भर करता है)
नीचे की रेखा यह अंत में Yield() पर कॉल करेगी।

Thread.Yield() केवल धागे की बारी को छोड़ देगा, और इसे अगले दौर में प्राप्त करेगा।

Thread.Sleep(0) केवल उपज कॉल करने के लिए एक अनुकूलन हो सकता है। (फिर से, कार्यान्वयन)

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