Ezxecutar uma thread sem implementar runnable [Resolvido]

14 respostas
D

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.

class MyThread1 extends Thread {
	void rum() {
		System.out.println("nome da Thread dada pela JVM:" + Thread.currentThread().getName());
		for(int i = 0; i < 5; i++) {
			System.out.println("Executando minha primeira Thread.");
		}
	}
	
	public static void main(String[] args) {
		MyThread1 mt = new MyThread1();
		mt.start();
	}
}

14 Respostas

F

eh pq o seu metodo esta escrito errado, eh “run” que deve se chamar e não “rum”

E

Esse já estava pensando na sexta-feira! :slight_smile: :slight_smile:

E

:smiley:

V

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(). 
class MyThread1 extends Thread {
	@Override   
	void rum() {
		System.out.println(&quot;nome da Thread dada pela JVM:&quot; + Thread.currentThread().getName());
		for(int i = 0; i &lt; 5; i++) {
			System.out.println(&quot;Executando minha primeira Thread.&quot;);
		}
	}
	
	public static void main(String[] args) {
		MyThread1 mt = new MyThread1();
		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

Legal, Vini, muito oportuna essa observação.

Às vezes, parece desnecessária a anotação, mas, nesse caso, ela teria se provado bem valiosa :slight_smile:

Valeu.

D
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(). 
class MyThread1 extends Thread {
	@Override   
	void rum() {
		System.out.println(&quot;nome da Thread dada pela JVM:&quot; + Thread.currentThread().getName());
		for(int i = 0; i &lt; 5; i++) {
			System.out.println(&quot;Executando minha primeira Thread.&quot;);
		}
	}
	
	public static void main(String[] args) {
		MyThread1 mt = new MyThread1();
		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

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

A classe Thread implementa Runnable. Isso responde sua pergunta?

D

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

Lembrando que ainda não concluí o capítulo de Thread.

P

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

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

Erro de compilação porque? O código do diegohsi funciona perfeitamente após a mudança que sugeri.

B

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”.

Criado 14 de janeiro de 2011
Ultima resposta 19 de jan. de 2011
Respostas 14
Participantes 7