Questão Thread

7 respostas
sandro_maximo

Alguém saberia dizer por que a saida deste exercício é MainWorks ?

class A implements Runnable {
  A (String nome) {
   new Thread(this,nome).start();
  }
  public void run () {
   
       System.out.print(Thread.currentThread().getName());
  
  }
 }
 public class b {
  public static void main (String args[]) {
   Thread.currentThread().setName("Main"); 
   Runnable a  = new A("Worker");  
   a.run();  
  }
 }

EDIT (Thingol) - Pus os tags [ code ] - por favor, não se esqueçam de pôr os tags [ code ] para melhorar a legibilidade de seu código.

7 Respostas

jgbt

pq o metodo main tmb é uma thread.
então:

Thread.currentThread().setName("Main")

vc vai ter duas trheads rodando

[]'s

keller

Ok, o metodo main é uma thread e isso não pode ser nenhuma novidade para quem estiver estudando pra certificação, mas essa questão me deixou em duvida…

package org.scjp;

public class TesteRunnable {
   public static void main (String args[]) {
   		Thread.currentThread().setName("Main");
   		// Renomeia a Thread 'main'
   		
   		Runnable a  = new A("Worker");  
   		a.run();
   }
}

class A implements Runnable {
   A (String nome) {
   		new Thread(this,nome).start(); //Cria uma nova referencia a um objeto Thread
   		// Com a ClasseA e o nome recebido da class TesteRunnable  
   }
   public void run () {	    
   		System.out.print(Thread.currentThread().getName());
   }
}

Então teriamos 2 Threads,
a ‘main’ renomeada de mainThread-0 para Main
e a criada na classe A com o nome de Worker…

tá mal explicado isso… :roll:
alguem poderia dar uma melhor explicação? :smiley:
valeu! :wink:

keller

Fazendo uns Traces aqui aconteceu o que eu pensava…
A thread main é renomeada para Main…

Mas nao consegui entender porque a Thread2 ganho MainWorker e nao apenas Worker… :?

smota

:roll: :roll: :roll: … alguém consegue explicar?

Eu li a JLS, mas não ficou esclarecido … fui ver o fonte da classe thread e o nome é setado simplesmente this.name = name.toCharArray(); e depois o getName só return String.valueOf(name); :shock:

Luiz_Henrique_Coura

A chamada ao método a.run() é executada antes da Thread disparada pelo contrutor da classe A. Sendo assim ele pega o nome da Thread q à chamou, ou seja, a classe TesteRunnable.

Olha o teste:
public class TesteRunnable {
    public static void main (String args[]) {
        Thread.currentThread().setName("Main");
    		
        Runnable a  = new A("Worker");  
        a.run();
    }
}
 
class A implements Runnable {
    A(String nome) {
        System.out.println( "Criando classe A" );
        new Thread(this,nome).start();
    }

    public void run () {
        //Retirem o comentário desse trecho q vcs verão o resultado com 
        //maior clareza.
        //if(Thread.currentThread().getName().equals("Worker")){
        //    System.out.println("\nExecutando Classe A ");
        //}

        //Basta colocar println que vcs verão q ninguém mudou de nome, 
        //é apenas seguido uma ordem na execução das Threads
        System.out.println(Thread.currentThread().getName());
    }
}

Ou seja, primeiro ele imprime "Main" da Thread principal e depois ele executa a Thread A, a string "Worker".

keller

100% entendido! :smiley:
Valeu! :thumbup:

(5 estrelas)

S

Vlw Pessoal,

Entendi perfeitamente !!!

Criado 11 de maio de 2005
Ultima resposta 16 de mai. de 2005
Respostas 7
Participantes 6