2012-06-20 13 views
7

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

public class EmailManager implements Runnable { 
    PortalManagementSBLocal pmbr= this.lookupPortalManagementSB(); 
    Thread runner; 
    String emailServerName = ""; 
    String smtpPort = ""; 
    String emailTo = ""; 
    String emailFrom = ""; 
    String mailer = "JavaMailer"; 
    String subject = ""; 
    String message = ""; 

    public EmailManager() { 
    }//default constructor 

    public EmailManager(String emailTo, String subject, String message){ 

     this.emailTo=emailTo; 
     this.subject = subject; 
     this.message = message; 
     //need to make this dynamic 
     this.emailFrom = pmbr.getEmailFrom(); 
     this.emailServerName = pmbr.getEmailServerName(); 
     this.smtpPort = pmbr.getEmailSMTPPort(); 
     //runner = new Thread(this,"Email"); 
     runner = new Thread(this); 
     runner.start(); 
     System.out.println("***** Email Thread running..."); 


    } 

    @Override 
    public void run(){ 
     sendEmail(); //This is never called 
    } 

वास्तव में किसी भी मार्गदर्शन का स्वागत करेंगे:

नीचे मेरी नमूना कोड है! अनेक अनेक धन्यवाद!

+0

और आप निश्चित हैं कि शुरू() कहा जा रहा है? क्या आप मेल() को भेजने से पहले रन() की शुरुआत में एक लॉग संदेश जोड़ सकते हैं? –

+0

क्या आप व्युत्पन्न प्रकार के ईमेल प्रबंधक का निर्माण कर रहे हैं? –

+1

गंदा डिजाइन, थ्रेड को तुरंत चालू करना और इसे कन्स्ट्रक्टर में शुरू करना। दौड़ की स्थिति उत्पन्न करने के लिए लगभग निश्चित है। – Qwerky

उत्तर

8

फोन आप कैसे हैं पता है कि इस विधि को कभी नहीं कहा जाता है?

नीचे दिया गया सरल परीक्षण काम करता है। इसलिए कोई समस्या नहीं है एक धागा टिंग और इसे कन्स्ट्रक्टर के भीतर से चल रहा है। तो कुछ और चल रहा है जो आपको sendEmail() कहने से रोक रहा है।

public class Test implements Runnable { 
    Thread runner; 
    public Test() { 
    this.runner = new Thread(this); 
    this.runner.start(); 
    } 

    @Override 
    public void run() { 
    System.out.println("ya"); 
    } 

    public static void main(String[] args) { 
    new Test(); 
    } 
} 
+3

हाय सभी पोस्ट के लिए धन्यवाद! मुझे एहसास है कि मेरा डीबगर धावक थ्रेड के बजाय मुख्य धागा चला रहा था। इसके अलावा मेरी sendEmail विधि में कोई समस्या थी, इसलिए मैंने शुरू में सोचा कि रन विधि निष्पादित नहीं की गई थी। एक बार फिर मार्गदर्शन के लिए धन्यवाद! –

+2

"डीबगर मुख्य धागा चला रहा था", यही मेरी समस्या थी! चीयर्स उपयोगकर्ता 1433483 – Felix

3

मुझे लगता है कि समस्या यह है कि आप इस को कन्स्ट्रक्टर कॉल पूरा होने से पहले गुजर रहे हैं। यह आपकी मदद कर सकता है: https://stackoverflow.com/a/5623327/1441485

1

न एक निर्माता में runner = new Thread(this); का उपयोग

चाल "runner = new Thread(this); runner.start();

समारोह init करने के लिए, नए का उपयोग कर उदाहरण बना सकते हैं और इस init()

-1

इसे कन्स्ट्रक्टर से बाहर ले जाएं। कन्स्ट्रक्टर के अंदर बात करने के लिए कोई "यह" नहीं है।

1
runner = new Thread(this); 
     runner.start(); 

आपका इस वस्तु ठीक से प्रारंभ नहीं है, निर्माता रिटर्न जब तक। तो इसे कहीं और ले जाएं, हो सकता है कि आप इस नए धागे को कहां बना सकें।

+0

आपकी टिप्पणी को स्पष्ट करने के लिए, मुझे यह जवाब दिलचस्प पाया गया: http://stackoverflow.com/a/5623396/3519951 आंशिक रूप से प्रारंभिक ऑब्जेक्ट केवल तभी समस्याग्रस्त है जब इसमें अनियमित फ़ील्ड हों। इस प्रश्न के मामले में, थ्रेड लॉन्च करना कन्स्ट्रक्टर में आखिरी चीज है, इसलिए "आंशिक रूप से प्रारंभिक" राज्य हानिरहित है। –

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