Thread Kate Siera

5 respostas
deyvid
  1. Assume the following method is properly synchronized and called from a thread A on an object B:
    wait(2000);
    After calling this method, when will the thread A become a candidate to get another turn at
    the CPU?
    A. After object B is notified, or after two seconds
    B. After the lock on B is released, or after two seconds
    C. Two seconds after object B is notified
    D. Two seconds after lock B is released

A resposta é A a página é 776

Eu não entendi quem recebeu o bloqueio se foi A ou B!? Porque a questão é “when will the thread A become a candidate to get another turn at the CPU?” parece dizer que o wait partiu do objeto B e A foi blocked a espera de um notifyAll() ou os “2000” para pode ser candidata outra vez

mas a resposta indica que B que precisava ser notificada ou esperar pelos segundos!

que nó! :shock:

5 Respostas

A

eu teria acertado por dedução mas com detalhe confesso q tb não entendí…

ViniGodoy

O objeto B é o monitor. A thread A é quem fica parada. Isso aí seria feito assim:

public class SomeClass
{
   private Object b = new int[0];

   public void someMethod() {
      synchronized(b) {
          b.wait(2000);
       }
   }
}

Note que uma thread A inicia seu processamento e chama o método someMethod(). Isso faz com que ela a thread A chame sobre o objeto B o wait (como diz o enunciado) e durma.

Quando uma outra thread chamar o notify em b (num outro trecho com synchronized (b)) será A que irá acordar, pois A é quem dorme ali.

Não confunda a thread com o monitor. O monitor é o objeto que recebe as notificações e que controla o sleep. A thread é quem efetivamente percorre os métodos e é interrompida pelo processador. Objetos não sofrem bloqueios, eles apenas os controlam. Quem sofrem bloqueios são apenas threads.

luiz_renato

Vini ,

Sua explicação foi muito boa , me perdoa a pergunta besta mas no caso quem possui o bloqueio de quem quando uso um bloco synchonized?

Luiz Renato

evertonsilvagomesjav

luiz_renato:
Vini ,

Sua explicação foi muito boa , me perdoa a pergunta besta mas no caso quem possui o bloqueio de quem quando uso um bloco synchonized?

Luiz Renato

Um Thread possui o bloqueio do objeto usado no bloco sincronizado.

deyvid

Fale ViniGodoy, mas dua coisas estão me confundindo nessa questão

  1. tá sendo chamado “wait(2000);” e não b.wait(2000);”, é como se o próprio objeto da classe/Thread A estivesse chamando em algum momento

  2. A resposta “After object B is notified, or after two seconds”, traduzindo fica “Depois que o objeto B é notificado, ou depois de dois segundos” e que me leva pensar que A tinha chamado o método wait(2000) e posto o B em estado de espera.

Quanto a sua explicação foi muito boa, mas minha dúvida passa ser semantica. Eu acho

Criado 21 de setembro de 2010
Ultima resposta 22 de set. de 2010
Respostas 5
Participantes 5