Duvida sobre questao

5 respostas
evertonsilvagomesjav

Pessoal porque esse codigo imprime Dog e não Cat. Sendo que no Thread é passado o Runnable.

public class T {

	Runnable r = new Runnable(){

		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("Cat");		
		}
	};
	
	Thread t = new Thread(r){
				
		public void run(){
			System.out.println("Dog");
		}
		
	};
	
	void go(){
		
		t.start();
		
	}
	
	
	public static void main(String[] args) {
		
		new T().go();
		
	}
}

5 Respostas

bdias1990
hread t = new Thread(r){  
                  
        public void run(){  
            System.out.println("Dog");  
        }  
          
    };

na verdade vc criou uma subclasse da classe Thread e sobscreveu o metodo run() da mesma, então na minha opnião vc criou uma nova subclasse como se criasse um novo "new" bem eu acho q é isso kkkk so to dando uma opnião e com isso na hora do start(); como é uma nova subclasse ta pegando o run() da sobscrita nao do destino(r) invocando tipo o construtor padrao ou fazendo com que a variavel de instancia Runnable que tem no thread fique null pelo novo new q deu e o start test ela primeiro e veja que é null e use o run() dela msm no caso sobscrito. vai saber realmente nao sei so opnioes

ViniGodoy

http://www.guj.com.br/posts/list/212054.java#1078663

evertonsilvagomesjav

Quando eu sobreescrevi o método run() de thread, o novo thread executou seu método ok.

Mas olhando o exemplo, quando eu passo um runnable para um Thread startar o método run(), como o start() dispara o thread, sendo que nao tem o “target” dentro do método start??

ViniGodoy
evertonsilvagomesjava:
ViniGodoy:
http://www.guj.com.br/posts/list/212054.java#1078663

Quando eu sobreescrevi o método run() de thread, o novo thread executou seu método ok.

Mas olhando o exemplo, quando eu passo um runnable para um Thread startar o método run(), como o start() dispara o thread, sendo que nao tem o "target" dentro do método start??

A classe thread, de maneira ultra-simplificada, é assim:

public class Thread {
   private Runnable target;

   public Thread() {
   }

   public Thread(Runnable target) {
      this.target = target;
   }

   public void run() {
      if (target != null) {
         target.run(); //Dispara o runnable recebido como parâmetro no construtor
      }
   }

   public void start() {
      //Toda lógica nativa aqui para criar um thread e disparar o this.run();
   }
}

Então, se você sobrescreve o método run() de Thread, aquele if vai pro espaço. Então, o run() do target nunca será chamado.

Se você não sobrescreve, e passa um Runnable como parâmetro, é aquele código que roda. O start() dispara outra thread, que inicia em this.run(). Esse por sua vez, como primeira ação, chama, o run() do target passado no construtor.

evertonsilvagomesjav
ViniGodoy:
evertonsilvagomesjava:
ViniGodoy:
http://www.guj.com.br/posts/list/212054.java#1078663

Quando eu sobreescrevi o método run() de thread, o novo thread executou seu método ok.

Mas olhando o exemplo, quando eu passo um runnable para um Thread startar o método run(), como o start() dispara o thread, sendo que nao tem o "target" dentro do método start??

A classe thread, de maneira ultra-simplificada, é assim:

public class Thread {
   private Runnable target;

   public Thread() {
   }

   public Thread(Runnable target) {
      this.target = target;
   }

   public void run() {
      if (target != null) {
         target.run(); //Dispara o runnable recebido como parâmetro no construtor
      }
   }

   public void start() {
      //Toda lógica nativa aqui para criar um thread e disparar o this.run();
   }
}

Então, se você sobrescreve o método run() de Thread, aquele if vai pro espaço. Então, o run() do target nunca será chamado.

Se você não sobrescreve, e passa um Runnable como parâmetro, é aquele código que roda. O start() dispara outra thread, que inicia em this.run(). Esse por sua vez, como primeira ação, chama, o run() do target passado no construtor.

Bommm demais!!! Vlww Vini!!

Criado 20 de agosto de 2010
Ultima resposta 23 de ago. de 2010
Respostas 5
Participantes 3