Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程启动不调用run_Java_Multithreading - Fatal编程技术网

Java 线程启动不调用run

Java 线程启动不调用run,java,multithreading,Java,Multithreading,我被一个奇怪的问题弄糊涂了。基本情况是这样的。我在我的类中实现了runnable,我在一个新线程中传递了该类,我在实现runnable的类中重写了我的run()方法,然后启动线程。但是,我的start()方法从不调用我的run()方法。我搜索过论坛,但似乎找不到其他类似的问题 下面是我的示例代码: public class EmailManager implements Runnable { PortalManagementSBLocal pmbr= this.lookupPortalM

我被一个奇怪的问题弄糊涂了。基本情况是这样的。我在我的类中实现了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
    }

非常感谢您的指导!非常感谢

我认为,问题是您在构造函数调用完成之前传递了这个
这可能会对您有所帮助:

不要使用
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为了澄清您的评论,我发现这个答案很有趣:部分初始化的对象只有在具有未初始化的字段时才有问题。在这个问题中,启动线程是构造函数中完成的最后一件事,因此”“部分初始化”状态是无害的。