2013-10-22 4 views
7

मेरे पास एक कक्षा है जो आने वाले संदेशों के लिए श्रोता है और हमेशा के लिए जिंदा रहना चाहिए (ताकि यह आने वाले संदेशों के लिए सुन सके) जब तक कि मैं इसके लिए कनेक्शन को स्पष्ट रूप से डिस्कनेक्ट नहीं करता। मैंने थ्रेड को सेटडैमन (झूठा) के रूप में घोषित कर दिया है लेकिन यह कॉलिंग विधियों की समाप्ति के साथ समाप्त हो जाता है।श्रोता थ्रेड एलीव को कैसे रखें

कृपया मुझे बताएं कि उस धागे को जीवित रखने के लिए और कृपया कुछ प्रकाश डालने के लिए स्प्रिंग टास्क एक्स्सेलर को कैसे कार्यान्वित किया जाए, इस पर कुछ प्रकाश डालें।

अग्रिम धन्यवाद। यह एक श्रोता है जब कोई संदेश भेजता है तो उसे अधिसूचित किया जाता है ... तो मैं इसे कैसे चला सकता हूं?

श्रोता वर्ग

public class MyListnerImpl implements Listener { 
    private final connectionImpl con; 

    public MyListnerImpl(ConnectionImpl con) { 
    if (con.isAuthenticated() && con.isConnected()) { 
     if (logger.isInfoEnabled()) { 
      logger.info("Initializing XmppListner:"); 
     } 
     this.itsCon = con; 
     Thread t1 = new Thread(this); 
     t1.setDaemon(false); 
     t1.start(); 
    } 
    } 

    public final void listnerInterfaceMethod(final Chat chat, final Message message) { 
     System.out.println("Message" + message); 
    } 

    public final void run() { 
    itsCon.getChatManager().addChatListener(new ChatManagerListener() { 
     public void chatCreated(final Chat chat, final boolean createdLocally) { 
      if (!createdLocally) { 
       chat.addMessageListener(itsFbml); 
      } 
     } 
    }); 
    } 
} 

कॉलिंग वर्ग बस अपने वस्तु बनाता है और धागा श्रोताओं निर्माता द्वारा शुरू किया जाता है।

मैं इस थ्रेड को तब तक चलाना चाहता हूं जब तक कि मैं इसे बाधित नहीं करता।

उपयोग otherThread.join():

+0

क्या आप अपना कोड पोस्ट कर सकते हैं? – Rajj

+0

संभावित डुप्लिकेट [आप जावा में एक पंक्ति में एक थ्रेड कैसे लटकाते हैं?] (Http://stackoverflow.com/questions/3203139/how-do-you-hang-a-thread-in-java-in-one -लाइन) – SSP

+0

मैंने धागा पोस्ट किया है, सज्जन कृपया मुझे बताएं कि आम तौर पर श्रोता चलने के लिए आप क्या करते हैं? –

उत्तर

2

कुछ चीजें आप कर सकता है कि प्रारंभिक धागा हमेशा के लिए फांसी से बेहतर होगा रहे हैं। इससे वर्तमान धागे का कारण बन जाएगा जब तक कि अन्य थ्रेड निष्पादित नहीं हो जाता है। जैसा कि @ नंदा सुझाव देता है, थ्रेड के पूल समाप्त होने तक प्रतीक्षा करने के लिए ExcecutorService.shutdown() का उपयोग करें। otherThread.setDaemon(false) का उपयोग करें और बस अपना प्रारंभिक थ्रेड निकालें। यह आपके नए धागे को उपयोगकर्ता धागे के रूप में सेट करेगा। जावा तब तक बंद नहीं होगा जब तक कि केवल थ्रेड चलने वाले डिमन थ्रेड न हों। जब तक किसी को notify() कहता है, या हमेशा के

synchronized(this) { 
    while (true) { 
     this.wait(); 
    } 
} 

यह वर्तमान वर्ग के मॉनिटर पर वर्तमान धागा इंतजार कर देगा।

से How do you hang a thread in Java in one line?

+0

प्रश्न पोस्ट किए जाने के बाद आप इस 6 _seconds_ का उत्तर कैसे दे पाए? – Gray

+0

@ ग्रे इसे पेस्ट कॉपी करने में लंबा समय नहीं लगता है! – meda

+0

अंतिम पंक्ति को पढ़ा और इस प्रश्न के लिए सही उत्तर खोजने में 6 मिनट लग गए और यह भी उल्लेख किया कि मुझे यह जवाब कहां से मिला है – SSP

1

की नकल की (या एक त्रुटि/अपवाद फेंक) आप इसे जिंदा रखने के लिए, एक पाश का उपयोग करना चाहते हैं, तो वापस जाने के लिए और किसी भी त्रुटि/अपवाद नहीं पकड़ एक धागा run() रिटर्न जब तक जिंदा कहते हैं।

+0

हैलो पीटर, यह एक श्रोता है जब कोई संदेश भेजता है तो अधिसूचित हो जाता है ... तो मैं इसे कैसे चला सकता हूं? मैंने इसे गैर डिमन थ्रेड के रूप में घोषित किया है लेकिन कॉलर थ्रेड समाप्ति के साथ समाप्त होता है। आप इस तरह की चीज कैसे लागू करते हैं? –

+0

यह स्पष्ट नहीं है कि आप धागे को नियंत्रित करते हैं या नहीं। चाहे यह एक deamon है या न केवल कार्यक्रम से बाहर निकलने में रोकने में महत्वपूर्ण है। यदि आप धागे को नियंत्रित करते हैं, तो आपको अपना कोड बदलना होगा। यदि थ्रेड लाइब्रेरी द्वारा बनाया गया है, तो आपको यह समझने की आवश्यकता है कि पुस्तकालय कैसे काम करता है। –

+0

बीटीडब्ल्यू आपके द्वारा शुरू किया गया धागा कुछ भी नहीं दिखता है। आप इसे हटा सकते हैं और यह वही काम करेगा। यह श्रोताओं को बुलाया नहीं जा सकता है। –

0

यह मैं कैसे समस्याओं को हल किया है कि समय, तो इस मामले बहु सूत्रण का नहीं था, बस एक ही धागा जो हमेशा के लिए चलाने के लिए आवश्यक, तो

public final void run() { 
while(true) 
{ 
//Run Method Logic... 
} 
} 

सम्मिलित किया गया था और से यह instantiated है एक वसंत बीन। मैं इस एकल थ्रेडेड परिदृश्य जैसे awaitTermination() के लिए और अधिक फैंसी चीजें देख रहा था; या कुछ इस तरह का।

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