2012-06-20 9 views
7

Estoy confundido con un problema extraño. Básicamente, la situación es así. Implementé el ejecutable en mi clase, paso la clase en un nuevo hilo, anulo mi método run() dentro de la clase que implementa el ejecutable y luego comienzo el hilo. Sin embargo, mi método start() nunca llama a mi método run(). He buscado en los foros pero parece que no puedo encontrar otro problema similar.thread start no ejecuta run

A continuación es mi código de ejemplo:

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 
    } 

Realmente agradecería cualquier orientación! ¡Gracias una tonelada!

+0

¿Y está seguro de que se está llamando a start()? ¿Puedes agregar un mensaje de registro al inicio de run() antes de llamar a sendMail()? –

+0

¿Está construyendo el tipo derivado de EmailManager? –

+1

Diseño repugnante, crear instancias del hilo y comenzarlo en el constructor. Casi seguro que generará condiciones de carrera. – Qwerky

Respuesta

8

Cómo hacer que ¿sabe que este método nunca se llama?

La siguiente prueba simple funciona. Así que no hay problema para crear ting un hilo y ejecutarlo desde dentro del constructor. Por lo tanto, hay algo más que le impide ver que se llama al 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(); 
    } 
} 
+3

Hola a todos por la publicación. Me doy cuenta de que mi depurador ejecutaba el hilo principal en lugar del subproceso Runner. También hubo un problema con mi método sendEmail, así que inicialmente pensé que el método de ejecución no se había ejecutado. Gracias por la guía una vez más! –

+2

"el depurador estaba ejecutando el hilo principal", ¡ese era mi problema! Cheers user 1433483 – Felix

1

literatura no toman runner = new Thread(this); en un constructor

movimiento "runner = new Thread(this); runner.start();

a la función init, crear instancia mediante nuevo y llamar a este init()

-1

Muévelo fuera del constructor. No hay "esto" por así decirlo dentro del constructor.

1
runner = new Thread(this); 
     runner.start(); 

Su este objeto no se ha inicializado correctamente, hasta que las declaraciones del constructor. Así que muévelo a algún lado, puede ser donde generas este nuevo hilo.

+0

Para aclarar tu comentario, encontré esta respuesta interesante: http://stackoverflow.com/a/5623396/3519951 Un objeto parcialmente inicializado es problemático solo si tiene campos no inicializados. En el caso de esta pregunta, lanzar el hilo es lo último que se hace en el constructor, por lo tanto, el estado "parcialmente inicializado" es inofensivo. –

Cuestiones relacionadas