Threads

Olá,

Nao entendi porque este programa imprimi:

“Minha Thread: start( )” seguido de "Executa:run( ) ".

Alguem poderia por favor me explicar em detalhes?


Class MinhaThread extends Thread {
         
         public void run ( ) {
         System.out.println("MinhaThread: run ( )" );
         }	
         
         public void start ( ) {
          System.out.println("MinhaThread: start ( )" );
         }
}

Class Executa implements Runnable {
        
         public void run ( ) {
          System.out.println("Executa: run ( )" );
         }
	
         public void start ( ) {
          System.out.println("Executa: start ( )" );
         }
}

public  class Teste {
       
         public void static void main (  String args[ ] ) {

            MinhaThread mt = new MinhaThread( );
            Executa          ex = new Executa( );
            Thread            th = new Thread (ex);
            mt.start ( );
            th.start ( );
      }
}

A diferença da Classe MinhaThread para a executa é:

MinhaThread: O método main cria um objeto da classe MinhaThread e chama o método start definido na superclasse. Este método cria uma nova thread que irá executar o método run do próprio objeto assim que o escalonador da JVM decidir.

Já a classe Executa: Este construtor recebe como parâmetro uma referência a um objeto que implementa a interface java.lang.Runnable, uma interface muito simples que declara um único método: public void run(). Ao se chamar este construtor a referência passada como argumento é armazenada e ao ser invocado o método start() da thread ela registra a thread junto ao escalonador (até aqui o comportamento é identico ao caso anterior). Contundo, quando a thread obtém o processador, o método run do objeto que implementa a interface Runnable é executado (não o método run do objeto da classe Thread).

Dê uma olhada aqui: http://www.jspbrasil.com.br/jsp/tutoriais/tutorial.jsp?idTutorial=002_009

O start, manda a Thread iniciar a execução em ambos os casos.
E dentro de Run, é que deve ficar a parte do seu código que será tratada como Thread.

Quando você estende a classe Thread tem que anular só o run().
Se você anular o start() ele não chama o run().

Faça um teste, na classe MinhaThread altere o nome de start() para starte() e recompile.
O resultado vai ser o esperado.

Já no caso da interface o start() não existe e o run() é chamado diretamente.

Obrigado pessoal!!

Otimo tutorial,Hericksnake!! Valeu
Obrigado mais uma vez JavaDrops
Era essa explicacao que eu precisava!!