Threads (essa é ninja!)

6 respostas
T

Aê galera… essa é boa

class A extends Thread { String[] sa; public A(String[] sa) {this.sa = sa;} public void run() { synchronized (sa) { while (!sa[0].equals("Done")) { try {sa.wait();} catch (InterruptedException ie) {} }} System.out.print(sa[1] + sa[2] + sa[3]); }} class B { private static String[] sa = new String[]{"Not Done","X","Y","Z"}; public static void main (String[] args) { Thread t1 = new A(sa); t1.start(); synchronized (sa) { sa[0] = "Done"; sa[1] = "A"; sa[2] = "B"; sa[3] = "C"; sa.notify(); }}}

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

a. Prints: XYZ
b. Prints: AYZ
c. Prints: ABZ
d. Prints: ABC
e. Compile-time error
f. Run-time error
g. None of the above

Abraço

6 Respostas

J

bah… eu acho que ficaria com a resposta G…
qeu codigozinho mais chato hein?!
ahiuehaiuehaiuhe

S

A resposta é a letra d olhem porque:

QUANDO A CLASSE B PASSA O ARRAY PARA O CONTRUTOR DA CLASSE A É PASSADA UMA REFERENCIA AO OBJETO ARRAY SA.
ASSIM QUANDO A THREAD DA CLASSE A VE QUE O ELEMENTO SA[0] N É DONE ELE CLAMA wait() QUE VAI ESPERAR ATÉ QUE QUE SE CHAME O METODO notify() OU notityAll(). ANTES QUE ESSES METODOS SEJAM CHAMADOS (REPARE QUE PARTE DO CODIGO DO METODO UM DA CLASSE A É SICRONIZADO E PARTE DO CODIGO DA CLASSE B TAMBEM) ASSIM DEPOIS QUE A THREAD ENTRA EM WAIT() ELA ESPERA O NOTITY() E O CODIGO SICRONIZADO DO MAIN DA CLASSE B É EXECUTADA MODIFICANDO O ARRAY E DANDO NOTIFY(). SENDO AS RESPOSTA QUE IRÁ APARECER SERÁ
ABC
ENTENDERAM?
EU ESPLICO MUITO ENROLADO FLW… N REPAREM N! :razz:

R

Acredito que não compila pq !sa[0] vai dar pau. O operador ! só pode ser usado sobre booleanos

Robson

T

Shadow… resposta correta … eh a D mesmo.

L

“Robson”:
Acredito que não compila pq !sa[0] vai dar pau. O operador ! só pode ser usado sobre booleanos

Robson

Nada a ver.
é

observe a chamada do método equals.

R

Você tem razão.

Vacilo meu!

Robson

Criado 8 de janeiro de 2005
Ultima resposta 11 de jan. de 2005
Respostas 6
Participantes 5