2011-04-29 7 views
8

किसी साझा संसाधन तक पहुंच को सिंक्रनाइज़/कतारबद्ध करने के लिए, मैं प्रतीक्षा लूप द्वारा सहायता प्राप्त Semaphore का उपयोग करने जा रहा हूं।SystemClock.sleep() बनाम थ्रेड.sleep() एक सेमफोर लूप की प्रतीक्षा करते समय

सीपीयू pegging में चलाने के क्रम में, मैं while पाश के अंदर थोड़ा सा करना चाहूंगा।

मैं http://developer.android.com संदर्भ खोज की है और इस तरह के दो नींद पाया() कार्य करता है और मैं के रूप में जो करने के लिए एक फिट बैठता है भ्रमित कर रहा हूँ जो परिदृश्य:

  1. Thread.sleep()
  2. SystemClock.sleep()

कौन सा बेहतर सूट जिस मामले में मैंने वर्णन किया और क्यों?

+0

'SystemClock.sleep()' UI थ्रेड में चलता है ... मुझे लगता है। –

उत्तर

18

सबसे पहले, क्या आपको वास्तव में प्रतीक्षा लूप की आवश्यकता है? आप सामान्य रूप से उचित अधिसूचनाओं का उपयोग करके अपनी समस्याओं का समाधान कर सकते हैं, यानी ऑब्जेक्ट रखते हुए, प्रतीक्षा करें() और सूचित करें() या अन्य तरीकों से (जैसे अवरुद्ध कतार, या सेमफोर.एक्वायर() आपके मामले में)।

जिसके अनुसार, यदि आप वास्तव में एक मतदान पाश (जो आप वास्तव में जब तक आप के लिए है नहीं करना चाहिए) चाहता हूँ, मुझे Thread.Sleep साथ रहना चाहते हैं()। दस्तावेज कहता है कि इसमें कोई फर्क नहीं पड़ता है, सिवाय इसके कि आपके पास Thread.sleep() को बाधित करने का विकल्प है। ऐसा करने का विकल्प खुद को छुटकारा न दें।

ध्यान दें कि Thread.sleep() के मामले में, आपको उस अपवाद को पकड़ना होगा - यदि आप बेहद आलसी हैं, तो आप शायद SystemClock.sleep() से चिपके रहेंगे।

+0

इस महान और समय पर स्पष्टीकरण के लिए धन्यवाद। मैंने अभी पाया है कि 'सेमफोर.एक्वायर() 'सबसे अच्छा विकल्प हो सकता है। – srf

+0

यदि आप प्रतीक्षा() का उपयोग कर रहे हैं तो आपको लूप में ऐसा करने की आवश्यकता है। प्रतीक्षा करें() सूचित करने के लिए कॉल से पहले वापस आ सकता है()। Http://docs.oracle देखें।सही उपयोग के लिए com/javase/7/docs/api/java/lang/Object.html # प्रतीक्षा करें()। "सात सप्ताह में सात कंसुरेंसी मॉडल: जब थ्रेड अन्वेषण" इस विषय को अच्छी तरह से कवर करता है। – Jonathan

0

सत्य है:

Thread.Sleep (एन) asyncTask.cancel (सही) का उपयोग करके AsyncTask की तरह एक कॉल के भीतर बाधित किया जा सकता है

SystemClock.sleep (एन) किसी भी बाधित आदेश की उपेक्षा करने लगता है , इस प्रकार यह स्मृति रिसाव का खतरा हो सकता है जब आप इसे इसी तरह यहां की तरह उपयोग करें: https://github.com/square/leakcanary/blob/master/leakcanary-sample/src/main/java/com/example/leakcanary/MainActivity.java

+0

वे संबंधित नहीं हैं। यह उदाहरण स्क्रीन को घुमाने के लिए समय देने के लिए बस नींद का उपयोग करता है, जो रिसाव का कारण बनता है। –

2

Thread.Sleep() जावा द्वारा प्रदान की क्रिया है। InterruptedException इस फ़ंक्शन के कॉल के दौरान हो सकता है।

SystemClock.sleep() एंड्रॉइड द्वारा प्रदान किया गया एक फ़ंक्शन है। इंटरप्टेड अपवाद इस फ़ंक्शन के कॉल के दौरान नहीं होता है, और इंटरप्ट ईवेंट अगले इंटरप्ट ईवेंट तक देरी हो जाएगी।

SystemClock.sleep (मिली सेकंड) बहुत Thread.Sleep (मिली सेकंड) के लिए इसी तरह एक उपयोगिता समारोह है, लेकिन यह InterruptedException ध्यान नहीं देता। यदि आप Thread.interrupt() का उपयोग नहीं करते हैं, तो यह फ़ंक्शन का उपयोग विलंब के लिए करें, क्योंकि यह थ्रेड की बाधित स्थिति को सुरक्षित रखेगा।

निष्कर्ष: यदि आप एंड्रॉइड एप्लिकेशन को पकड़ना चाहते हैं तो SystemClock.sleep (millis) के साथ जाएं।

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