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