2015-12-17 10 views
5

मैं एक धागा चलाना चाहते हैं जब मैं एक बटन दबाएँनई धागा कई बार

public void ButtonClick(){ 

    Thread thread = new Thread(){ 
     public void run(){ 
      Log.i("Test", "I'm in thread"); 
     } 
    }; 
    thread.start(); 
} 

मेरा प्रश्न है: मैं इस बटन पर कई बार क्लिक करने के लिए चाहते हैं। "थ्रेड इन थ्रेड" संदेश के बाद अभी भी कई धागे मौजूद हैं? या हर बार रन फ़ंक्शन समाप्त हो जाता है, धागा नष्ट हो जाता है?

यदि मैं एक ही समय में चल रहे कई धागे बनाते हैं, तो मैं उन्हें एक साफ तरीके से कैसे बंद कर सकता हूं?

आपकी मदद के लिए धन्यवाद!

+0

मुझे लगता है कि आपको मैन्युअल रूप से नए धागे बनाने के बजाय निष्पादक सेवा का उपयोग करना चाहिए। –

उत्तर

8

"थ्रेड में हूं" संदेश के बाद भी कई धागे मौजूद हैं मुद्रित है?

नहीं। उनमें से प्रत्येक स्वचालित रूप से नष्ट हो जाएगा।

यदि मैं एक ही समय में चल रहे कई धागे बनाते हैं, तो मैं उन्हें एक साफ तरीके से कैसे बंद कर सकता हूं?

धागे को रोकने के लिए कोई ज़रूरत नहीं, वे अपने आप नष्ट हो जाएगा एक बार वे अपने कार्य (रन के निष्पादन) खत्म।

समेकन और सुरक्षा को संभालने के लिए आपको java.util.concurrent में देखना चाहिए जो जावा में समेकन को संभालने के लिए उपयोगिता ढांचा है।

+1

और जावा एक और थ्रेड रोकने का कोई तरीका नहीं प्रदान करता है, क्योंकि यह ** सुरक्षित नहीं है **। – VicX

+1

आपके उत्तर के लिए धन्यवाद। मुझे एक और समाधान देने के बजाय सीधे मेरे प्रश्न का उत्तर देने वाला एकमात्र व्यक्ति है! – Stochelo

1

हर समय थ्रेड बनाना एक बुरा विचार थ्रेड पूल का उपयोग करना है।

0

बेनामी थ्रेड के बजाए रननेबल को लागू करने वाला एक वर्ग बनाएं ... जितना आप चाहें उतने धागे बनाते हुए चलने योग्य ऑब्जेक्ट बनाते हैं क्योंकि अज्ञात रननेबल ऑब्जेक्ट बनाने से केवल एक ही ऑब्जेक्ट बनाता है जिससे आप अपनी आवश्यकताओं को प्राप्त करने के लिए सीमित कर सकते हैं। किसी अन्य को बनाने से पहले थ्रेड स्थिति की जांच करें या एक थ्रेड ग्रुप (अवमूल्यित) या थ्रेड पूल बनाएं जो आप रननेबल के बजाय कॉल करने योग्य का उपयोग करते हैं और इसे निश्चित आकार के थ्रेड पूल में पास करते हैं या आप रननेबल को कॉल करने योग्य में परिवर्तित कर सकते हैं और फिर इसे पूल में पास कर सकते हैं रूप में कई बार आप की तरह के रूप में "मैं धागा में हूँ"

class Thop implements Runnable 
{ 
     public void run() 
     { 
        // operation 
     } 
} 
+0

आपके उत्तर के लिए धन्यवाद! – Stochelo

2

कई धागा अभी भी संदेश के बाद मौजूदा कर रहे हैं मुद्रित किया जाता है? या हर बार रन फ़ंक्शन समाप्त हो जाता है, धागा नष्ट हो जाता है?

आपके मामले में, आप प्रत्येक थ्रेड क्लिक के लिए थ्रेड बनने के बाद से कई धागे बना रहे हैं।

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

बेहतर समाधान प्रत्येक बटन क्लिक के लिए एक नया थ्रेड नहीं बना रहा है। यदि आपको अपने आवेदन में अधिक थ्रेड की आवश्यकता है, तो थ्रेड के पूल के लिए जाएं।

जावा इस उद्देश्य के लिए Executor ढांचा प्रदान करता है। यह बेहतर तरीके से थ्रेड जीवन चक्र का प्रबंधन करता है।

उपयोग एपीआई में से एक है, जो Executors

उदा से ExecutorService वापस आ जाएगी newFixedThreadPool(4)

अधिक 0 विकल्पों के लिए इस post और यह article पर एक नज़र डालें।

मामले में मैं कई सूत्र जो एक ही समय में चल रहे हैं बनाने के लिए, कैसे मैं उन्हें एक साफ तरह से बंद कर सकते हैं?

आप कर सकते हैं बंद ExecutorService के रूप में एसई पोस्ट के नीचे में उद्धृत: HandlerThread और Handler

देखें:

How to properly shutdown java ExecutorService

आप Android का उपयोग कर रहे हैं, आप बहु सूत्रण के लिए एक और अच्छा विकल्प है अधिक जानकारी के लिए नीचे पोस्ट करने के लिए:

Android: Toast in a thread

+0

यह सवाल का जवाब नहीं देता है और सबसे अच्छी टिप्पणी है। – John

+0

अधिक जानकारी जोड़ा गया। –

+1

यदि आप यह जोड़ने जा रहे हैं कि धागा "नष्ट हो जाएगा," तो आप कारण बता सकते हैं कि क्यों। समाप्ति _allows_ धागे को नष्ट करने के लिए, लेकिन यह धागा को नष्ट करने के लिए _cause_ नहीं है। किसी भी अन्य वस्तु को नष्ट करने के कारण एक 'थ्रेड' वस्तु नष्ट हो जाती है: जीसी पुन: दावा करता है जब कोई लाइव संदर्भ नहीं होता है। 'थ्रेड' ऑब्जेक्ट के बारे में विशेष बात यह है कि जब तक थ्रेड चल रहा है, तब तक JVM कार्यान्वयन कोड के भीतर से एक लाइव संदर्भ होगा। –

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