【问题标题】:thread start does not call run线程启动不调用运行
【发布时间】:2012-06-22 13:35:03
【问题描述】:

我对一个奇怪的问题感到困惑。基本上情况是这样的。我在我的类中实现了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
    }

非常感谢任何指导!非常感谢!

【问题讨论】:

  • 你确定 start() 被调用了吗?在调用 sendMail() 之前,您可以在 run() 的开头添加一条日志消息吗?
  • 你构造了EmailManager的派生类型吗?
  • 讨厌的设计,实例化线程并在构造函数中启动它。几乎肯定会产生竞争条件。
  • @Qwerky 我并不是说这是一个好的设计,但我看不出它会如何产生竞争条件。每次实例化这种类型的对象时,在执行方面,这与在构造函数之外启动一个线程没有什么不同。

标签: java multithreading


【解决方案1】:

我认为,问题在于您在构造函数调用完成之前传递了 this。 这可能会对您有所帮助:https://stackoverflow.com/a/5623327/1441485

【讨论】:

    【解决方案2】:

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

    移动“runner = new Thread(this); runner.start();

    初始化函数,使用new创建实例并调用这个init()

    【讨论】:

      【解决方案3】:

      你怎么知道这个方法永远不会被调用?

      下面的简单测试有效。所以创建一个线程并从构造函数中运行它是没有问题的。因此,还有其他事情正在阻止您看到正在调用 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();
        }
      }
      

      【讨论】:

      • 大家好,感谢您的帖子!我意识到我的调试器正在运行主线程而不是运行线程。我的 sendEmail 方法也有问题,所以我最初认为 run 方法没有执行。再次感谢您的指导!
      • “调试器正在运行主线程”,这就是我的问题所在!干杯用户1433483
      【解决方案4】:

      将它移出构造函数。可以说构造函数内部没有“this”。

      【讨论】:

        【解决方案5】:
        runner = new Thread(this);
                runner.start();
        

        在构造函数返回之前,您的 this 对象未正确初始化。所以把它移到我们的某个地方,可能是你产生这个新线程的地方。

        【讨论】:

        • 为了澄清您的评论,我发现这个答案很有趣:stackoverflow.com/a/5623396/3519951 部分初始化的对象只有在它具有未初始化的字段时才会有问题。在这个问题的情况下,启动线程是构造函数中完成的最后一件事,因此“部分初始化”状态是无害的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 2020-10-17
        • 2013-10-06
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        相关资源
        最近更新 更多