Dúvida com Thread (Certificação)[Resolvido]

5 respostas
moacirjava

Não consegui entender muito bem porque a resposta são as letras A e C

public class Threads 1 {
  intx=0;
  public class Runner implements Runnable {
  public void run() {
    int current = 0;
    for(int=i=0;i<4;i++){
      current = x;
      System.out.print(current + ", ");
      x = current + 2;
    }
  }
 }

 public static void main(String[] args) {
   new Threads1().go();
 }

 public void go() {
   Runnable r1 = new Runner();
     new Thread(r1).start();
     new Thread(r1 ).start();
   }
 }

Which two are possible results? (Choose two.)
A. 0, 2, 4, 4, 6, 8, 10, 6,
B. 0, 2, 4, 6, 8, 10, 2, 4,
C. 0, 2, 4, 6, 8, 10, 12, 14,
D. 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,
E. 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,

Na letra C pode-se interpretar que uma thread executou e a outra começou a executar. Já no restante não entendi muito bem. Alguém pode me dar um help?! :lol:

5 Respostas

ViniGodoy

A D e a E não tem nem o que falar. O for só vai até o 4, como teria mais de 8 respostas?

O caso da thread B é complexo. Ali, podem haver 2 hipóteses:

a) A thread 1 finalizou, e a thread 2 assumiu a partir do número 8. Como ela roda sozinha e seu contador já está em 8, não poderia retroceder para o 2.
b) As threads estão alternando, com a preempção ocorrendo exatamente no final de cada for. Nesse caso, ambas as threads também teriam suas variáveis locais acima de 2 e, portanto, também não haveria como retroceder o contador depois daquele 10 ali.

moacirjava

Obrigado, esclareceu muitas dúvidas!!! :thumbup:

ribclauport

Viny, desculpe ressucitar um tópico tão antigo, mas estava lendo e fiquei com uma dúvida:

A resposta A pode estar correta?

A. 0, 2, 4, 4, 6, 8, 10, 6,

Como após a impressão do valor 10, conseguiria voltar ao valor 6?, Não consegui entender como pode imprimir o valor 6 após a impressão do valor 10, ou seja imprimir 10 e depois 6…

Obrigado.

ViniGodoy

Desculpe a demora para responder. Não havia visto sua dúvida.
Isso pode ocorrer pois current é uma variável local. Portanto, cada thread terá sua cópia e, assim, ela pode armazenar um valor antigo.

A preempção na thread A, no caso da alternativa A, deve ter ocorrido na linha do println do “4,”.
A thread B assume, aumenta o valor de x até o 10, quando voltar para a thread A, a linha executada será:
x = current + 2;
Como no caso da alternativa A, current era 4, o próximo valor impresso será 6.

Entretanto, vale observar que se um valor já apareceu 2 vezes, o valor restaurado de x nunca será menor que esse valor.

Também vale ressaltar que essa é uma questão complexa, dependente de escalonamento, e acho muitíssimo improvável que seja cobrada numa prova de certificação séria.

ribclauport

Obrigado Vini pela sua resposta, depois vou queimar a cuca analisando novamente…, fiz a prova dia 14 e realmente não caiu coisas deste tipo graças a Deus, mais realmente vou comprar depois o livro que você me indicou, e me aprofundar mais em semáforos, mutex e coisas do tipo, que não tive na faculdade e na Pós muito menos, e aproveito para agradecer sua ajuda, citei você em meu review com agradecimentos.

Criado 12 de dezembro de 2009
Ultima resposta 24 de mai. de 2012
Respostas 5
Participantes 3