2015-06-13 13 views
7

मैं एक धागा ही काम करने के लिए जब एक निश्चित परिस्थिति में आता है कि है नहीं तो यह सिर्फ एक खाली अनंत लूप से अधिक दोहराता:।जावा अनंत लूप प्रदर्शन

public void run() { 
    while(true) { 
     if(ball != null) { 
      // do some Calculations 
     } 
    } 
} 

यह जब पाश लेकिन वास्तव में ऐसा प्रदर्शन को प्रभावित करता है कुछ भी नहीं, लेकिन यह जांचना है कि क्या इसे प्रत्येक पुनरावृत्ति की गणना करना है या नहीं? केवल आवश्यक होने पर यह थ्रेड बनाना मेरे लिए एक विकल्प नहीं है, क्योंकि मेरी कक्षा जो रननेबल लागू करती है वह एक दृश्य वस्तु है जो हर समय दिखाया जा सकता है।

संपादित करें: तो क्या यह एक अच्छा समाधान है? या यह एक अलग विधि (प्रदर्शन से संबंधित) का उपयोग करना बेहतर है?

private final Object standBy = new Object(); 

public void run() { 
    while(true) { 
     synchronized (standBy) { 
      while(ball != null) // should I use while or if here? 
       try{ standBy.wait() } 
       catch (InterruptedException ie) {} 
     } 
     if(ball != null) { 
      // do some Calculations 
     } 
} 

public void handleCollision(Ball b) { 
    // some more code.. 
    ball = b; 
    synchronized (standBy) { 
     standBy.notify(); 
    } 
} 
+2

'ब्लॉकिंग क्यूयू' का उपयोग करें; यह अनंत लूप आपके सभी सीपीयू समय खाएगा। – twentylemon

+1

कोई परिस्थिति नहीं है जिसमें यह धागा काम नहीं करता है। यह हमेशा काम कर रहा है। –

+1

क्या आपके कंप्यूटर में एक अतिरिक्त प्रोसेसर है? यदि आपके पास पर्याप्त प्रोसेसर हैं, तो लगातार चलने योग्य धागा सस्ता है। यदि नहीं, तो यह आपको खर्च करता है। –

उत्तर

7

आप धागे को सोने के लिए डालने पर विचार करना चाहेंगे और केवल तभी जाग रहे हैं जब आपका 'बॉल' चर सत्य हो जाए। java.util.concurrent कक्षाओं का उपयोग करने के लिए बहुत कम स्तर, wait और notify कथन का उपयोग करने से ऐसा करने के कई तरीके हैं जो ऐसा करने में कम त्रुटि प्रवण तरीका प्रदान करते हैं। condition इंटरफेस के लिए प्रलेखन पर एक नज़र डालें। BlockingQueue जैसी डेटा संरचना भी एक समाधान होगी।

2

हां, यह निश्चित रूप से प्रदर्शन को प्रभावित करेगा। प्रदर्शन बढ़ाने के लिए, आप अपने कोड में थोड़ी देर देरी (500ms या 1000ms या इससे भी अधिक कहें) डालने पर विचार कर सकते हैं कि आपके लिए कितना महत्वपूर्ण समय है।

3

अपने धागे के बीच BlockingQueue साझा करें।

class Producer implements Runnable { 
    private final BlockingQueue queue; 
    Producer(BlockingQueue q) { queue = q; } 
    public void run() { 
    try { 
     while (true) { queue.put(produce()); } 
    } catch (InterruptedException ex) { ... handle ...} 
    } 
    Object produce() { ... } 
} 

class Consumer implements Runnable { 
    private final BlockingQueue queue; 
    Consumer(BlockingQueue q) { queue = q; } 
    public void run() { 
    try { 
     while (true) { consume(queue.take()); } 
    } catch (InterruptedException ex) { ... handle ...} 
    } 
    void consume(Object x) { ... } 
} 
7

हां यह करता है। यह busy waiting का सबसे सरल कार्यान्वयन है, और जब भी संभव हो से बचा जाना चाहिए। प्रतीक्षा/अधिसूचना या java.util.concurrent तंत्र का उपयोग करें। हो सकता है कि आप अधिक उपयोगी प्रतिक्रिया प्राप्त करने के लिए वास्तव में क्या हासिल करना चाहते हैं, इसके बारे में अधिक विशिष्ट होना चाहिए।

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