2011-01-18 16 views
9

मैंने थ्रेड का उपयोग कभी नहीं दिया। जब तक मैंने नेटबीन्स का नवीनतम संस्करण डाउनलोड नहीं किया, तब तक सोचा। नेटबीन्स अब आपको थ्रेड का उपयोग न करने की चेतावनी देता है। सो जाओ। इसलिए मैंने इस विषय पर कुछ शोध किया और लोगों को यह बताते हुए पाया कि आपको केवल थ्रेड का उपयोग करने की आवश्यकता है। डीबगिंग/परीक्षण उद्देश्यों के लिए सो जाओ और यदि आप इसे किसी अन्य समय इस्तेमाल करते हैं तो आपके पास खराब लिखित कोड है।थ्रेड के उपयोग से कैसे बचें। नींद

तो मेरा सवाल यह है कि मैं थ्रेड का उपयोग कैसे कर सकता हूं। निम्नलिखित स्थिति में सो जाओ।

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

  1. डेटा सॉकेट आ संभालती है और अन्य जानकारी या बस सामान्य acknoledgements वापस भेजता है।

  2. यह मुख्य धागा है। सॉकेट थ्रेड को लात मारने के बाद यह लूप के दौरान अनिश्चितकालीन में जा रहा है। इस दौरान लूप के दौरान मैं यह सुनिश्चित करने के लिए जांच करता हूं कि सॉकेट थ्रेड अभी भी सक्रिय है और उपयोगकर्ता ने ट्रेयकॉन इंटरफ़ेस के माध्यम से एप्लिकेशन से बाहर निकलने के लिए नहीं कहा है। तब मैं सोता हूं और लूप के दौरान इसे जारी रखता हूं।

इस एप्लिकेशन के साथ, ट्रे आइकन एकमात्र यूआई है।

// continues running as long as the exitth file is not present and 
// the tray icon is not in a safe to exit status. 

while(doNotExit()) 
{ 

    if (getPrimaryThread() == null || !getPrimaryThread().isAlive()) 
     resetsThreadAndSocket(); 

    try 
    { 
     // check to see if the socket threads are still active, if not create new ones. 
     if ((getPrimaryThread() == null || !getPrimaryThread().isAlive()))  
      createSocketThread(); 

     // check right before sleeping that the user does not want to exit. 
     if(getTrayIcon().isExiting()) 
      break; 

     // puts the main Thread to sleep for 3 seconds 
      Thread.sleep(3000); 
    } 
    catch(SQLException ex) 
    { 
     _log.error(ex.getMessage(), ex); 
     restartDatabase(); 
    } 
} 
+2

आपको यहां पहली जगह सोने की आवश्यकता क्यों है? – Elalfer

+0

हम में से कई मल्टीथ्रेडिंग (मुझे शामिल करते हैं) हमारे प्रोसेसर को जलाने, या लचीलापन की समस्याएं पैदा करने के बारे में चिंता करते हैं – Pete

+0

मैं नहीं हूं कि आप यहां थ्रेड.sleep() का प्रदर्शन क्यों कर रहे हैं। क्या आप किसी साझा संसाधन (कुछ डेटा संरचना या ऑब्जेक्ट) तक पहुंचने से बचने की कोशिश कर रहे हैं? –

उत्तर

3
अपने Thread.Sleep (3000) के बजाय

कार्य करें::

getPrimaryThread().join(3000) 

यह 3 सेकंड के लिए बाहर निकलने के लिए थ्रेड के लिए इंतजार करेंगे

यहाँ टुकड़ा मैं संदर्भित कर रहा हूँ है।

6

अधिकांश मामलों में 'पसंदीदा' विधि का उपयोग आवधिक कार्य करने के लिए ScheduledExecutorService को आवधिक कार्य करने के लिए किया जाएगा, बजाय इसे हर समय एक लूप और Thread.Sleep() का उपयोग करके स्वयं को पुन: कार्यान्वित करने के बजाय किया जाएगा।

आपके उदाहरण के साथ कुछ भी गलत नहीं है। जावा 5 के रूप में उसमें निर्मित करने के लिए अभी भाषा का एक और अधिक मजबूत समर्थन है।

2

आपको अपने राज्य को मतदान करने के बजाय अपने ट्रे आइकन पर ईवेंट श्रोता संलग्न करने पर विचार करना चाहिए। इस तरह आपको निगरानी के लिए अतिरिक्त थ्रेड की आवश्यकता नहीं होगी।

यदि आप किसी कारण से ऐसा नहीं कर सकते हैं, तो आप अभी भी अतिरिक्त थ्रेड से दूर हो सकते हैं क्योंकि Timer कक्षा आपके लिए प्रतीक्षा कर सकती है।

1

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

public void run() { 
    while(!Thread.currentThread.isInterrupted()) { 
     try { 
      //you application logic 
     } catch (RuntimeException e) { 
      //log uncaught exception 
     } 
    } 
} 

आदेश बंद करने के लिए आवेदन, आप trayicon जो के लिए एक संदर्भ निहित करने के लिए एक श्रोता देते हैं में सॉकेट थ्रेड और इसे आसानी से बाधित करके इसे रोक सकता है।

socketThread.interrupt(); 

मैं यह समझने के लिए छोड़ दूंगा कि एक एक्शनलिस्टर को आपके लिए ट्रेकॉन में कैसे जोड़ना है।

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