Uma questão sobre threads

11 respostas
A

Tirado do mock do Dan Chisholm:

class A extends Thread {
  public A(Runnable r) {super(r);}
  public void run() {System.out.print("A");}
}
class B implements Runnable {
  public void run() {System.out.print("B");}
}
class C {
  public static void main(String[] args) {
    new A(new B()).start();
  }
}

What is the result of attempting to compile and run the program?

a. Prints: A
b. Prints: B
c. Prints: AB
d. Prints: BA
e. Compile-time error
f. Run-time error
g. None of the above

11 Respostas

ricardolecheta

imprime A

o construtor de Thread pode receber um Runnable, este exemplo apenas sobrescreve este construtor :slight_smile:

vale lembrar que agora não existe mais o construtor default:

new A().start(); // erro de compilação
danieldestro

Isso mesmo… ele imprime “A”.

A

A resposta é A mesmo, eu só não consegui entender porque executa o run() de A e não de B já que este é o Runnable passado como parâmetro.

Aliás estou ficando desanimada com este assunto de Threads, alguém sabe onde posso encontrar uma explicação melhor do seu funcionamento, pois já vi no curso que fiz, no livro de certificação, no tutorial, etc e as questões do simulado são muito diferentes e complicadas do que estas fontes !
Na verdade eu não estou conseguindo visualizar todos estes detalhes que estão nas questões dos mocks…

Obrigada…

Daniel_Quirino_Olive

[editado]Daniel falou besteira e, para o bem da humanidade, editou este post. Volte sempre.
[/editado]

danieldestro

Como o método run() foi sobrescrito, ele não chamará o método run() do Runnable, pois, creio eu, a implementação default do run() da classe Thread seja:

run( ) { runnable.run(); }

A

Aí é que fica a confusão…
Vejamos o seguinte exemplo:

class MyRunnable implements Runnable { 
  public void run() {System.out.print("Minha thread");} 
} 
class TesteRunnable { 
  public static void main(String[] args) { 
    new Thread(new MyRunnable()).start(); 
  } 
}

Neste caso o método run() executado é o do objeto MyRunnable passado como parâmetro para o objeto Thread.
Este é um exemplo que encontrei em todas as minhas fontes de estudo…
Ou seja, o parâmetro para a Thread é o target a ser usado.
Daí eu não me convenci porque é usado o run() da subclasse de Thread na questão que coloquei acima.
Será porque ela tem prioridade sobre a runnable do target? :?

danieldestro

Não, mas pelo fato de VOCÊ ter SOBRESCRITO o método run( ) da Thread (no exemplo anterior), ele não “chamou” o método run( ) da Runnable.

rode os exemplos:

class MyRunnable implements Runnable { 
  public void run() {System.out.print("Minha runnable");} 
}

public class TesteRunnable {
  public static void main(String[] args) { 
    new Thread(new MyRunnable()).start(); 
  } 
}

e então

class MyRunnable implements Runnable { 
  public void run() {System.out.print("Minha runnable");} 
}

class MyThread extends Thread {
  public void run() {
    super.run();
    System.out.print("Minha thread");
  }
}

public class TesteRunnable {
  public static void main(String[] args) { 
    new Thread(new MyRunnable()).start(); 
  } 
}
A

Acho que agora eu entendi… :lol:

Obrigada.

sandro_maximo

Olá, pessoal.

Também estou estudando para certificação, e essa discução de vcs me deixou em dúvida.

No meu entendimento o que ocorre é o seguinte.

No primeiro caso é criado uma instância de uma classe Thread (A extends Thread) , passando como parâmetro uma instância de uma classe Runnable (B implements Runnable).

new A(new B()).start();

O comando acima equivale a :

A obj = new A(new B());
Como A tem um contrutor que recebe um Runnable, que chama (super®) o contrutor,não default, de Thread passando um Runnable, tudo bem até aqui.

obj.star();

Bom, o método start que está sendo executado é o da classe A.
Sendo assim, o método run() que será executado é o da classe A, e o da classe B não será executado porque não foi executado o método start dela.

Obs1.:

Se substituirmo a linha

new A(new B()).start();

por

B obj1=newB();

new A(obj1).start();

B.start();

O método run() de B também será executado.

Correto ?

M
<blockquote>Se substituirmo a linha

new A(new B()).start();

por

B obj1=newB();

new A(obj1).start();

B.start();

O método run() de B também será executado.

Correto ?

na verdade nao. Na verdade a questão acho q é mais sobre herança certo?

vou tentar explicar o q eu acho q acontece:

A classe Thread devia ter um método run parecido com o seguinte:

public void run() {

runnable.run();

}

onde runnable é o Runnable q vc passa na instanciação. qd vc especializa a classe, este método é sobrescrito pelo seu run() q vai executar o q vc necessita (no caso, imprimir A). De certa forma, o método run acima que olha para o Runnable recebido como argumento não é executado (a menos q vc chame explicitamente super.run() e, no caso, o resultado seria a impressão de B)

consegui explicar um pouquinho?

[]s
takeshi

saulo_f

O codigo da implementação da classe
OBS: target é a referência do objeto Runnable passado no construtor!

public void run() { if (target != null) { target.run(); } }

Criado 5 de outubro de 2003
Ultima resposta 26 de jan. de 2011
Respostas 11
Participantes 7