11

私は奇妙な問題に困惑しています。基本的にはこのような状況です。クラスにランナブルを実装し、クラスを新しいスレッドに渡し、ランナブルを実装する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
    }

ガイダンスをいただければ幸いです。ありがとうございます!

4

5 に答える 5

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();
  }
}
于 2012-06-20T12:13:44.863 に答える
3

問題は、コンストラクターの呼び出しが完了する前にこれを渡していることだと思います。これはあなたを助けるかもしれません: https://stackoverflow.com/a/5623327/1441485

于 2012-06-20T12:09:13.520 に答える
1
runner = new Thread(this);
        runner.start();

コンストラクターが戻るまで、このオブジェクトは適切に初期化されません。したがって、この新しいスレッドを生成する場所に移動してください。

于 2012-06-20T12:25:06.677 に答える
1

runner = new Thread(this);コンストラクタで使用しないでください

動く "runner = new Thread(this); runner.start();

関数を初期化するには、new を使用してインスタンスを作成し、これを init() と呼びます

于 2012-06-20T12:10:33.593 に答える
-2

コンストラクターから移動します。コンストラクターの中にいわば「これ」はありません。

于 2012-06-20T12:14:15.643 に答える