2012-03-14 15 views
43

के रूप में वर्तमान में तुरंत राज्य सो में धागा निष्पादित करते समय यह कॉल [sleep][1](); तो चलता रहता है थ्रेड का सामना करना पड़ता है, जहां runnable राज्य/तैयार राज्य में [yield][2](); धागा चाल के लिए के रूप मेंनींद विधि और बहु ​​थ्रेडिंग की उपज विधि के बीच क्या अंतर है?

+1

उनके जावडोक क्या कहते हैं? –

+1

अंगूठे का नियम: 1) कभी भी 'उपज() 'का उपयोग न करें; 2) केवल 'नींद()' का उपयोग करें जब कार्यक्रम * स्पष्ट रूप से * निर्दिष्ट समय के लिए प्रतीक्षा करने के लिए आवश्यक है (यदि आपको केवल "थोड़ा इंतजार करना" की आवश्यकता है, तो सबसे अधिक संभावना है कि आप इसे गलत कर रहे हैं और आपको आवश्यकता है उचित प्रतीक्षा/सिग्नलिंग तंत्र को लागू करने के लिए)। –

उत्तर

78

sleep() थ्रेड निश्चित रूप से किसी निश्चित समय के लिए निष्पादन को रोकने का कारण बनता है; यदि कोई अन्य थ्रेड या प्रक्रिया चलाने की आवश्यकता नहीं है, तो CPU निष्क्रिय होगा (और शायद पावर सेविंग मोड दर्ज करें)।

yield() मूल रूप से इसका मतलब है कि धागा विशेष रूप से महत्वपूर्ण नहीं कर रहा है और यदि किसी अन्य धागे या प्रक्रियाओं को चलाने की आवश्यकता है, तो उन्हें चाहिए। अन्यथा, वर्तमान धागा चलना जारी रहेगा।

117

हम 3 से किसी भी विधि का उपयोग करके निष्पादन से एक धागा रोका जा सकता है

  1. yield()
  2. join()
  3. sleep()
  4. : थ्रेड वर्ग के
  1. yield() विधि निष्पादित करने के लिए एक ही प्राथमिकता के शेष धागे इंतजार कर के लिए एक मौका देने के लिए अस्थायी रूप से वर्तमान में क्रियान्वित धागा रुक जाता है। यदि कोई प्रतीक्षा धागा नहीं है या सभी प्रतीक्षा धागे की प्राथमिकता कम है तो वही धागा इसके निष्पादन को जारी रखेगा। उपजित थ्रेड जब इसे निष्पादन का मौका मिलेगा तो थ्रेड शेड्यूलर द्वारा तय किया जाता है जिसका व्यवहार विक्रेता निर्भर होता है।

  2. join() यदि कोई निष्पादन थ्रेड टी 1 join() पर t2 i.e पर कॉल करता है; t2.join() तुरंत टी 1 प्रतीक्षा स्थिति में प्रवेश करेगा जब तक कि टी 2 इसके निष्पादन को पूरा नहीं करता है।

  3. sleep() हमारी आवश्यकता के आधार पर हम एक निश्चित अवधि के लिए सोने की नींद में रहने के लिए धागे बना सकते हैं (उम्मीद है कि हमारी पसंदीदा विधि के लिए ज्यादा स्पष्टीकरण आवश्यक नहीं है)।

+2

कुछ सिंक्रनाइज़ेशन ऑब्जेक्ट जैसे म्यूटेक्स पर भी प्रतीक्षा कर रहा है। – Nick

+0

अच्छा स्पष्टीकरण, धन्यवाद अनंत। – Amit

3

नींद जबकि उपज धागा निलंबित कर देता है x मिलीसेकंड के लिए खुद को निलंबित करने के लिए धागा का कारण बनता है और तुरंत तैयार कतार (कतार जो सीपीयू धागे को चलाने के लिए उपयोग करता है) करने के लिए इसे ले जाता है।

27

Sleep() वर्तमान में चलने वाले धागे को सोने का कारण बनता है (अस्थायी रूप से निष्पादन बंद कर देता है)।

Yield() वर्तमान में निष्पादित थ्रेड ऑब्जेक्ट को अस्थायी रूप से रोकने और अन्य धागे को निष्पादित करने की अनुमति देता है। विषय का एक अच्छा विवरण के लिए

enter image description here

पढ़ें this

+12

इस प्रवाह में गलती है: स्लीपिंग स्टेट से लेकर रेडी-टू-रन तक हम अधिसूचित() को सूचित करते हैं() और सूचित करें सभी() – NguyenDat

+1

थ्रेड प्रवाह पर अच्छा चार्ट। – Mdhar9e

+0

अच्छा चार्ट, यह मुझे धागे के जीवन चक्र को और अधिक गहरा और स्पष्ट समझने में मदद करता है। – Amit

0

नींद() थ्रेड को निश्चित रूप से किसी निश्चित समय के लिए निष्पादन को रोकने का कारण बनता है; यदि कोई अन्य थ्रेड या प्रक्रिया चलाने की आवश्यकता नहीं है, तो CPU निष्क्रिय होगा (और शायद पावर सेविंग मोड दर्ज करें)। उपज() मूल रूप से इसका मतलब है कि धागा विशेष रूप से महत्वपूर्ण नहीं कर रहा है और यदि किसी अन्य धागे या प्रक्रियाओं को चलाने की आवश्यकता है, तो उन्हें चाहिए। अन्यथा, वर्तमान धागा चलना जारी रहेगा।

देखें http://preciselyconcise.com/java/concurrency/b_sleep.php

5

यील्ड: वर्तमान में क्रियान्वित धागा और धागा जो उपज का आह्वान किया है() धागा निष्पादन के अंत में जुड़ जाएगा के लिए इंतजार करना धागा कर देगा। धागा जो उपज() को कॉल करता है, उसकी बारी तक अवरुद्ध राज्य में होगा।

नींद: तर्कों में उल्लिखित समय के लिए धागे नींद मोड में सोएगा।

शामिल हों: टी 1 और टी 2 दो धागे हैं, t2.join() को तब टी 1 कहा जाता है जब तक टी 2 निष्पादन पूरा नहीं करता है। फिर टी 1 रनने योग्य राज्य में होगा तो हमारे विशेषज्ञ जेवीएम थ्रेड शेड्यूलर मानदंडों के आधार पर टी 1 उठाएंगे।

1

यील्ड: शेड्यूलर के लिए यह एक संकेत (गारेंटेड नहीं है) है कि आपने पर्याप्त किया है और उसी प्राथमिकता के कुछ अन्य धागे चल सकते हैं और CPU का उपयोग कर सकते हैं।

थ्रेड.sleep();

नींद: यह किसी विशेष समय के लिए उस विशेष धागे के निष्पादन को अवरुद्ध करता है।

TimeUnit.MILLISECONDS.sleep (1000);

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