Thread [resolvido]

7 respostas
J

Olá pessoal,

Alguem poderia detalhar o código abaixo não estou avaliando bem a execução dos Thread :shock:
1. class Waiting implements Runnable {
 2.   boolean flag = true;
 3.   public synchronized void run() {
 4.     if (flag) { 
 5.       flag = false;
 6.       System.out.print("1 ");
 7.       try { this.wait(); } catch (Exception e) { }
 8.       System.out.print("2 ");
 9.     }
10.     else {
11.       flag = true;
12.       System.out.print("3 ");
13.       try { Thread.sleep(2000); } catch (Exception e) { }
14.       System.out.print("4 ");
15.       notify();
16.     }
17.   }
18.   public static void main(String [] args) {
19.     Waiting w = new Waiting();
20.     new Thread(w).start();
21.     new Thread(w).start();
22.   }
23. }



Which two are true? (Choose two.)


A 	
	The code outputs 1 3 4.
B 	
	The code outputs 3 4 1.
C 	
	The code outputs 1 2 3 4.
D 	
	The code outputs 1 3 4 2.
E 	
	The code never completes.
F 	
	The code runs to completion.

Reference
Close
JLS 3.0,

Options D and F are correct.

7 Respostas

Dirceu_Roden
Você está criando duas threads:

new Thread(w).start();

new Thread(w).start();

.

Uma delas executa primeiro e obtem o bloqueio do objeto Waiting pelo método:

public synchronized void run()

.

Enquanto esta thread tiver o bloqueio nenhuma outra thread terá acesso a esta instância de Waiting.

.

A primeira thread imprime "1 " e em seguida através do método wait() libera o bloqueio do objeto e espera até que outra thread chame o método notify().

.

A Segunda thread entra em ação e imprime "3 " e em seguida espera por dois segundos e imprime "4 ".

Logo em seguida a segunda thread chama o método notify() e termina a sua execução.

.

A chamada a notify() fez a primeira thread voltar à execução.

Depois de imprimir "2 " a primeira thread também temina sua execução e o programa é finalizado.
ViniGodoy

Esse programa existe para mostrar que código mal implementado usando threads pode, como todo código mal implementado, levar a dificuldades horrendas de interpretação, a um comportamento inesperado e a dificuldades extremas de manutenção.

Detalhe, em algumas (raras) situações esse código pode imprimir 1 2 3 4.
Alguém poderia dizer o por quê?

Se não souber, tenha certeza que essas situações ocorrerão no cliente, na pior hora possível, na frente do maior número de pessoas possível, causando o maior prejuízo financeiro possível.

MaiqueL

No livro K&B diz que ao chamar o wait() o Tread abre mão do seu bloqueio.

Então imagino o seguinte caso chame o método wai() e a Thread do main não tenha dado o start na segunda Thread

vai ocorre a impressão de 1 2, logo após virá a proxima Thread que irá imprimir 34

. rs :lol:

Obs.: bom tentei agora espero uma explicação mais sólida…

M

esse código não imprime 1 2 3 4.

ViniGodoy

Não? Veja o detalhe escrito na documentação do método wait:

A thread can also wake up without being notified, interrupted, or timing out, a so-called spurious wakeup. While this will rarely occur in practice, applications must guard against it by testing for the condition that should have caused the thread to be awakened, and continuing to wait if the condition is not satisfied. In other words, waits should always occur in loops, like this one:

synchronized (obj) { while (<condition does not hold>) obj.wait(timeout); ... // Perform action appropriate to condition }

Para quem não domina muito o inglês, o javadoc diz que o wait pode acordar sozinho, em raros casos e, portanto, é sempre necessário coloca-lo dentro de um loop, que garanta que o código voltará para o wait, caso ele acorde repentinamente.

Por isso, tomem cuidado. Como já diz o ditado “Deus está em todo lugar, mas o Diabo está nos detalhes…”

M

você tem razão. :smiley:

deyvid

Nossa valeu véio

Criado 22 de abril de 2009
Ultima resposta 29 de abr. de 2009
Respostas 7
Participantes 6