2012-01-09 17 views
19

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

मेरा आवेदन एक दूरस्थ प्रणाली संपर्क करने के लिए और समय समय पर एक ऑपरेशन के राज्य के लिए मतदान, जब तक आपरेशन अगले अनुरोध भेजने से पहले पूरा हो गया है इंतज़ार कर एक की जरूरत है। फिलहाल कोड तार्किक करता है:

String state = get state via RPC call 
while (!state.equals("complete")) { 
    Thread.sleep(10000); // Wait 10 seconds 
    state = {update state via RPC call} 
} 

यह देखते हुए कि परिस्थिति एक दूरस्थ आपरेशन जाँच कर रहा है (जो कुछ हद तक एक महंगी प्रक्रिया है, में है कि कुछ सेकंड के लिए चलाता है), इस थ्रेड का एक मान्य इस्तेमाल होता है। नींद() थोड़ी देर में लूप? क्या इस तर्क को ढूढ़ने का कोई बेहतर तरीका है? मैं कुछ उदाहरण हैं, जहां मैं एक टाइमर वर्ग इस्तेमाल कर सकते हैं देखा है, लेकिन मैं, लाभ को देखने के लिए असफल के रूप में यह अभी भी ऊपर ही सीधा तर्क करने के लिए नीचे उबालने के लिए लगता है, लेकिन बहुत से अधिक जटिलता में फेंक दिया।

भालू इस बात को ध्यान में रखते हुए कि इस मामले में रिमोट सिस्टम न तो मेरे प्रत्यक्ष नियंत्रण में है, न ही यह जावा में लिखा गया है, इसलिए इस परिदृश्य में "सहकारी" होने के अंत में यह विकल्प एक विकल्प नहीं है। राज्य के लिए मेरे आवेदन के मूल्य को अपडेट करने का मेरा एकमात्र विकल्प एक एक्सएमएल संदेश बनाना और भेजना, प्रतिक्रिया प्राप्त करना, इसे पार्स करना और फिर मुझे आवश्यक जानकारी के टुकड़े निकालना है।

कोई सुझाव या टिप्पणी का स्वागत किया जाएगा।

+0

मैं अपनी स्थिति में लगता है कि यह पूरी तरह से सही है (यदि आप सूचना प्राप्त RPC कॉल समाप्त नहीं प्राप्त कर सकते हैं)। चेतावनी के आसपास पाने का तरीका चक्र के दौरान उपयोग कर रहा है। – kenota

+2

मुझे लगता है कि आरपीसी कॉल की स्थिति को मतदान करने की लागत 10 सेकंड की नींद की गारंटी देने के लिए काफी अधिक है। एक सेकंड अधिक उचित होगा, या नींद जो पिछले नींद के संचालन की संख्या के आधार पर लंबे समय तक प्रतीक्षा करेगी (निश्चित रूप से निश्चित पाठ्यक्रम के साथ)। –

+1

जैसा कि मैंने नोट किया है, रिमोट ऑपरेशन कई सेकंड तक चलता है (जिसके द्वारा मेरा मतलब 3-5 से कहीं भी है)। किनारे से कुछ मामलों को देखते हुए, वहाँ एक मामला है कि 10 सेकंड बहुत छोटा है किए जाने के लिए है। –

उत्तर

12

जब तक आपकी दूरस्थ प्रणाली एक घटना जारी है या नहीं तो आप एसिंक्रोनस रूप से सूचित कर सकते हैं, मुझे नहीं लगता कि इसके बाद के संस्करण बिल्कुल अनुचित है। आपको अपने sleep() समय बनाम आरपीसी कॉल के समय/भार को संतुलित करने की आवश्यकता है, लेकिन मुझे लगता है कि यह एकमात्र मुद्दा है और उपर्युक्त चिंता का विषय नहीं लगता है।

4

दूरदराज के अंत बदलने के लिए है कि वह अपने लंबे समय से चल प्रक्रिया के साथ किया जाता है एक "पुश" सूचना प्रदान करने में सक्षम होने के बिना, इस बारे में और साथ ही आप ऐसा करने में सक्षम होने के लिए जा रहे हैं है। जब तक थ्रेड.sleep समय मतदान की लागत की तुलना में लंबा है, तो आपको ठीक होना चाहिए।

0

आप (लगभग) नींद इसकी बहुत अक्षम और उसके नहीं एक अच्छा अभ्यास के बाद से उपयोग कभी नहीं करना चाहिए। हमेशा ताले और हालत चर का उपयोग करें जहां धागे एक दूसरे को संकेत देते हैं। देखें माइक Dahlin के Coding Standards for Programming with threads

एक टेम्पलेट है:

public class Foo{ 
    private Lock lock; 
    private Condition c1; 
    private Condition c2; 

    public Foo() 
    { 
    lock = new SimpleLock(); 
    c1 = lock.newCondition(); 
    c2 = lock.newCondition(); 
    ... 
    } 

    public void doIt() 
    { 
    try{ 
     lock.lock(); 
     ... 
     while(...){ 
     c1.awaitUninterruptibly(); 
     } 
     ... 
     c2.signal(); 
    } 
    finally{ 
     lock.unlock(); 
    } 
    } 
} 
+3

मुझे पूरा यकीन नहीं है कि यह कैसे मदद की जानी चाहिए। –

+0

खैर मुझे लगता है कि वह कैसे अपने तर्क संरचना करने के बारे में पूछ रहा है और मैं (एक सामान्य टिप्पणी के रूप में) कह रहा हूँ कि जब तक लूप के अंदर, वह एक शर्त चर का उपयोग करना चाहिए प्रक्रिया है कि बजाय पूरा होने की लगातार का उपयोग कर की प्रतीक्षा कर रहा है द्वारा संकेत करने के लिए नींद। – Cemre

+2

मैं इस व्यावहारिक मुद्दे पर ध्यान नहीं देता कि आरपीसी कुछ फैशन में सर्वेक्षण में शामिल किए जाने की जरूरत है कि यह नहीं लगता, करता है? –

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