Java 线程启动不调用run
我被一个奇怪的问题弄糊涂了。基本情况是这样的。我在我的类中实现了runnable,我在一个新线程中传递了该类,我在实现runnable的类中重写了我的Java 线程启动不调用run,java,multithreading,Java,Multithreading,我被一个奇怪的问题弄糊涂了。基本情况是这样的。我在我的类中实现了runnable,我在一个新线程中传递了该类,我在实现runnable的类中重写了我的run()方法,然后启动线程。但是,我的start()方法从不调用我的run()方法。我搜索过论坛,但似乎找不到其他类似的问题 下面是我的示例代码: public class EmailManager implements Runnable { PortalManagementSBLocal pmbr= this.lookupPortalM
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
}
非常感谢您的指导!非常感谢 我认为,问题是您在构造函数调用完成之前传递了这个。
这可能会对您有所帮助:不要使用
runner=新线程(此)构造函数中的代码>
移动“runner=新线程(此线程);
runner.start();
要初始化函数,请使用new创建实例并调用此init()如何知道从未调用过此方法?
下面的简单测试是有效的。因此,创建线程并从构造函数中运行它没有问题。因此,还有其他一些事情正在发生,阻止您看到正在调用sendmail()
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();
}
}
将其移出构造函数。可以说,构造函数内部没有“this”
runner = new Thread(this);
runner.start();
在构造函数返回之前,此对象未正确初始化。因此,将其移动到某个地方,可能是生成新线程的地方。并且您确定正在调用start()?能否在sendMail()之前将日志消息添加到run()的开始处调用?是否构造EmailManager的派生类型?糟糕的设计,实例化线程并在构造函数中启动它。几乎肯定会生成争用条件。@Qwerky我不是说这是一个好的设计,但我不知道它如何生成争用条件。从执行角度来看,这与启动线程没有什么不同每次实例化这种类型的对象时,ide都会调用构造函数。您好,谢谢您的帖子!我意识到我的调试器运行的是主线程而不是运行线程。我的sendEmail方法也有问题,所以我最初认为run方法没有执行。再次感谢您的指导!”“调试器正在运行主线程”,这就是我的问题所在!干杯用户1433483为了澄清您的评论,我发现这个答案很有趣:部分初始化的对象只有在具有未初始化的字段时才有问题。在这个问题中,启动线程是构造函数中完成的最后一件事,因此”“部分初始化”状态是无害的。