Threads1

6 respostas
giselezr

Oi pessoal, estava fazendo o simulado e me deparei com essa questão. Diz que a resposta certa é a letra A e C. A letra C entendi de boa, mas não entendo pq a letra A esta correta. Alguém pode me explicar?

public class Threads1 {
	int x = 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();
	}
}

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,

Answer: AC

6 Respostas

E

Note as seguintes linhas de código. O segredo é o print:

current = x;  
                System.out.print(current + ", ");   // este tempo não é desprezível
                x = current + 2;

Vou dar um exemplo do que pode ocorrer. Digamos que o print leve 1 microssegundo, e que ambas as threads, na linha 1 acima, peguem o valor de x = 4 no programa acima. Vou pôr números nas threads - t1 e t2.

x = 4
t1 - current = 4
t1 - print imprime current, que é 4
t2 - current = 4 (note que o tempo de print não é desprezível, e que x é atualizado só depois do print na thread 1)
t2 - print imprime current, que é 4
t1 - x = current + 2 = 6
t1 - current = x = 6
t1 - print imprime current, que é 6
t2 - x = current + 2 = 8

e assim por diante.

A

O exercício faz uma pegadinha com a variável current. Note q o print será dado 8 vezes , certo? dai já elimina-se dois itens (macete) . Para determinar o q provavelmente será impresso , pegamos um exemplo do q ocorre no item A . Digamos q o programa crie duas threads chamadas de t1 e t2, elas compartilham o mesmo target no caso é r1. então a variável de instância x será compartilhada entre ambas threads. Só não será o caso das variáveis locais, i e current.
Então se o programa começa por t1 ele poderia ser :

thread1:

i=0
current=0
print(0)
x=current+2
x=2

i=1
current=2 (pega o valor do x)
print(2)
x=4

i=2
current=4
print(4) ( neste Momento começa a thread 2 , que poderia começar só no final do loop ou em outro ponto qq)

thread2 :

i=0

x=4;

current=4 ;

print(4)

x=6

i=1
current=6
Print(6)
x=8

i=2
current=8
Print(8)
x=10

i=3
current=10
print(10)
x=12 ( fim do loop e note q nao houve interrupção mas poderia haver)

Voltamos pra thread1 do ponto de interrupção tinhamos:

i=2
current=4
print(4)

então continuamos com

x=current+2

aqui o pulo do gato, quanto é current para thread t1? 4 ou 10? 4 pois 10 era da thread2 que já finalizou e com ela suas variáveis locais.

logo a soma certa seria :

x=4+2 = 6

depois continuando o loop

1=3
current = 6
Print(6)
x=6+2=8 (Aqui termina o loop e o programa)

E

Sempre cai uma questão dessas nas provas de certificação.
Como elas são demoradas para resolver, mesmo com a dica do alexmonassa, eu sugiro que as deixe por último quando for fazer a prova.

giselezr

.

giselezr

veja se meu pensamento esta correto…
por eliminação (tem que mostrar 8 números pq o for é de 4 e tem duas threads) e letra D e E caem fora. Sobrando as letradas A,B e C. A letra C esta correta, é como se as threads executassem uma apos a outra somente incrementando a variável current (foi o resultado que deu na minha maquina). O negocio começa a ficar complicado na letra A e B. A letra B esta errada porque pq o algoritmo só incrementa e no final depois do 10 ele esta mostrando 2, 4 - (B. 0, 2, 4, 6, 8, 10, 2, 4,) como se não tivesse incrementado. Então só sobre a letra A, porem a letra A também volta o número 6 depois do 10 (A. 0, 2, 4, 4, 6, 8, 10, 6,), a explicação foi dada pelo alexmonassa que mostrou que ainda era a primeira thread em execução que tinha parado no numero 4, porem os numeros 2 e 4 que aparecem depois na letra B (B. 0, 2, 4, 6, 8, 10, 2, 4,) também não poderiam ser a continuação da primeira thread ?

A

Não, lembre q o current é uma variável local não do objeto r1. Então cada thread tem sua cópia. Diferentemente de current. Como a Thread foi interrompida pela máquina supostamente depois do print mas antes do somatório (x= current+2) , nunca teríamos esses prints de ir para o 10 e depois voltar para o 2. Ele repetiria apenas o último número da thread anterior, para este ponto de interrupção que eu imaginei , mas vc pode testar em outro ponto , no próprio programa (faça para 40 ou 400 e vais ver a diferença ) .
Se fosse, por exemplo, depois que o x já pegou o valor do current o ponto de interrupção daí teríamos uma sequência contínua.

Criado 16 de janeiro de 2013
Ultima resposta 18 de jan. de 2013
Respostas 6
Participantes 3