Ezxecutar uma thread sem implementar runnable [Resolvido]
14 respostas
D
diegohsi
Galera,
eu posso executar uma thread sem criar um objeto runnable nesse caso? Pois estou executando o código, porém não imprime nada na tela.
classMyThread1extendsThread{voidrum(){System.out.println("nome da Thread dada pela JVM:"+Thread.currentThread().getName());for(inti=0;i<5;i++){System.out.println("Executando minha primeira Thread.");}}publicstaticvoidmain(String[]args){MyThread1mt=newMyThread1();mt.start();}}
eh pq o seu metodo esta escrito errado, eh “run” que deve se chamar e não “rum”
E
esmiralha
Esse já estava pensando na sexta-feira!
E
erictorti
V
ViniGodoy
Como Thread implementa Runnable, você continua implementando um Runnable. :)
Entretanto, sobrescrever Thread não é considerada uma boa prática. O ideal é implementar a interface Runnable diretamente.
Dica. Sempre que sobrescrever um método, de qualquer classe, coloque a anotação @Override em cima desse método. Assim, se vc cometer um erro de grafia (como ocorreu nesse seu código), o compilador vai saber que sua intenção era sobrescrever alguma coisa, e vai te avisar que o método em questão não sobrescreve nada.
//Esse código agora dá erro, pois o compilador sabe que a intenção era //sobrescrever run() e não criar um novo método chamado rum(). classMyThread1extendsThread{@Overridevoidrum(){System.out.println("nomedaThreaddadapelaJVM:"+Thread.currentThread().getName());for(inti=0;i<5;i++){System.out.println("ExecutandominhaprimeiraThread.");}}publicstaticvoidmain(String[]args){MyThread1mt=newMyThread1();mt.start();}}
Isso é ainda mais útil quando você estiver sobrescrevendo suas próprias interfaces e classes. Assim, se você alterar o nome de um método na classe pai, o compilador automaticamente dará erro em todas as classes filhas onde você esquecer de alterar o nome do método também.
E
erictorti
Legal, Vini, muito oportuna essa observação.
Às vezes, parece desnecessária a anotação, mas, nesse caso, ela teria se provado bem valiosa
Valeu.
D
diegohsi
ViniGodoy:
Como Thread implementa Runnable, você continua implementando um Runnable. :)
Entretanto, sobrescrever Thread não é considerada uma boa prática. O ideal é implementar a interface Runnable diretamente.
Dica. Sempre que sobrescrever um método, de qualquer classe, coloque a anotação @Override em cima desse método. Assim, se vc cometer um erro de grafia (como ocorreu nesse seu código), o compilador vai saber que sua intenção era sobrescrever alguma coisa, e vai te avisar que o método em questão não sobrescreve nada.
//Esse código agora dá erro, pois o compilador sabe que a intenção era //sobrescrever run() e não criar um novo método chamado rum(). classMyThread1extendsThread{@Overridevoidrum(){System.out.println("nomedaThreaddadapelaJVM:"+Thread.currentThread().getName());for(inti=0;i<5;i++){System.out.println("ExecutandominhaprimeiraThread.");}}publicstaticvoidmain(String[]args){MyThread1mt=newMyThread1();mt.start();}}
Isso é ainda mais útil quando você estiver sobrescrevendo suas próprias interfaces e classes. Assim, se você alterar o nome de um método na classe pai, o compilador automaticamente dará erro em todas as classes filhas onde você esquecer de alterar o nome do método também.
Valeu vini, eu ja tinha visto esse @override mas não sabia pra que servia.
Agora eu estava vendo no livro da katy realmente é melhor implementar runable.
D
diegohsi
Mesmo eu corrigindo o metodo run(), ainda ocorre o erro de que eu não implementei runnable. Segue a minha pergunta novamente, "eu posso executar uma thread sem criar um objeto runnable nesse caso, ou sem implementar Runnable, extendendo apenas Thread??
B
brrodo
A classe Thread implementa Runnable. Isso responde sua pergunta?
D
diegohsi
A classe Thread implementa Runnable. Isso responde sua pergunta?
Veja bem Brrodo, li no livro da katy e o que entendi: Para executar, startar, enfim, uma Thread, temos que ter um objeto Runnable(trabalho) e um objeto Thread (trabalhador). Uma Thread necessita de ambos para existir uma nova pilha de métodos. Para criar um OBJETO Thread podemos exetender Thread (não aconselhavel) ou implementar Runnable. Agora a respota para a minha pergunta: 'Para executar uma Thread ou, criar uma nova pilha de métodos, é necessário de pelomenos um objeto THread e um Objeto Runnable."
OBS: Como Runnable é uma interface com o método run();, precisamos sobrescreve-lo, lembre-se: Sobrescrever o método run() de Runnable, pois se extendermos a classe Thread que possui um método run() ja sobrescrito da interface Runnable, ele será executado na pilha normalmente e não será criada uma nova pilha.
Pessoal, se eu escrevi alguma besteira me corrijam por favor, pois foi isso que entendi até o momento, as vezes eu não soube compriender na respostas anteriores dos nossos amigos.
D
diegohsi
Lembrando que ainda não concluí o capítulo de Thread.
P
programadora
O erro que ocorre, provavelmente decorre do fato de vc não implementar o método run() corretamente. O correto é:
você esqueceu do “public”.
vlw
B
brrodo
programadora:
O erro que ocorre, provavelmente decorre do fato de vc não implementar o método run() corretamente. O correto é:
você esqueceu do “public”.
vlw
É, mais aí teríamos erro de compilação.
P
programadora
Erro de compilação porque? O código do diegohsi funciona perfeitamente após a mudança que sugeri.
B
brrodo
Teríamos erro de compilação caso o problema fosse o modificador de acesso do método “run()” estar em “default” e não “public” e não o erro de que eu “não foi implementado runnable”.