2012-06-20 51 views
7

我對一個奇怪的問題感到困惑。基本上情況就是這樣。我在我的類中實現了runnable,我在新線程中傳遞類,我重寫了實現runnable的類中的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

你確定start()被調用?在sendMail()被調用之前,你可以在run()的開始處添加日誌消息嗎? –

+0

您是否構建了派生類型的EmailManager? –

+1

討厭的設計,實例化線程並在構造函數中啓動它。幾乎肯定會產生競爭條件。 – Qwerky

回答

8

你如何知道這種方法從來沒有被稱爲?

下面的簡單測試工作。所以沒有問題crea創建一個線程並從構造函數中運行它。所以還有其他事情正在阻止你看到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方法也有問題,所以我最初認爲run方法沒有執行。再次感謝指導! –

+2

「調試器正在運行主線程」,這就是我的問題!乾杯用戶1433483 – Felix

1

不要在構造函數中使用runner = new Thread(this);

移動「runner = new Thread(this); runner.start();

到初始化函數,使用新創建實例,並調用這個的init()

-1

將其移出構造函數。在構造函數裏面沒有「this」這樣的話。

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

對象未得到正確初始化,直到構造函數返回。所以把它移到我們的某個地方,可能是你產卵這個新線程的地方。

+0

要澄清您的評論,我發現這個答案很有趣:http://stackoverflow.com/a/5623396/3519951 部分初始化的對象只有在它有未初始化的字段時纔會出現問題。在這個問題的情況下,啓動線程是構造函數中最後一件事情,因此「部分初始化」狀態是無害的。 –