Duvida sobre questao

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

[code]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();
	
}

}[/code]

[code]hread t = new Thread®{

    public void run(){  
        System.out.println("Dog");  
    }  
      
}; [/code]

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® 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

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??

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??[/quote]

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

[code]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();
}
}[/code]

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.

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??[/quote]

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

[code]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();
}
}[/code]

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.[/quote]

Bommm demais!!! Vlww Vini!!