我对一个奇怪的问题感到困惑。基本上情况是这样的。我在我的类中实现了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 :(得分: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();
}
}
答案 1 :(得分:3)
我认为,问题是你在构造函数调用完成之前传递 this 。 这可能会对您有所帮助:https://stackoverflow.com/a/5623327/1441485
答案 2 :(得分:1)
不要在构造函数中使用runner = new Thread(this);
移动“runner = new Thread(this);
runner.start();
到init函数,使用new创建实例并调用此init()
答案 3 :(得分:1)
runner = new Thread(this);
runner.start();
您的此对象未正确初始化,直到构造函数返回。所以把它移到我的某个地方,可能是你产生这个新线程的地方。
答案 4 :(得分:-1)
将其移出构造函数。在构造函数中没有“this”可以这么说。