imprime: Main, pois o método run foi executado, entao nao foi criada uma nova Thread. Então a Thread da função main é a currentThread
mas como tudo em Thred é indeterminado, vc nao tem como garantir quem executa antes :D
M
marcosurata
Nao, tb achei q a resposta era essa, mas a saida certa eh
Main Worker
ricardolecheta
tem como garantir que a.run(); vai executar antes?
M
marcosurata
Nao sei qual eh o motivo dessa resposta. Fiz hoje o exame e uma das questoes q errei foi essa.
A
ana_abrantes
Pode ser C ou D e como é indeterminado, também E.
Licuri
Puts… eu também achei que como a thread não tinha startada ainda teóricamente não existe nenhuma thread rodando e nome que ele imprimiria seria “Worker”;
Alguem sabe explicar o que ouve ?
alberto_ribeiro
Olha não sei se estou certo, mas o psvm é uma thread executando, você manda rodar o programa ele roda como uma thread mesmo que você não o faça, e na sequencia você na mão manda executar a outra thread…
[]'s
Eduardo_Bregaida
Resposta: MainWorker
Qdo vc executa o Thread.currentThread().setName(“Main”); vc ta dizendo q o nome da thread corrente ou seja a do main, vai ser chamada de Main.
Dai ele tem um run dentro dele q chama akele SOP e imprime main.
Depois vc vai ter akele Runable que eu to passando como parametro p/ o contrutor A q vai se chamar Worker, a primeira thread já se foi, agora qdo der o Run ele imprime a segunda q é Worker.
Qdo compilar ele printa primeiro o Main, logo após o Worker
LPJava
eu vou na letra D, uma thread eh executada em uma nova pilha… qdo o construtor eh carregado… ai qdo o contrutor terminar o metodo principal executa…eu marcaria a D.
alan_parra
Olá marcosurata,
A resposta correta deveria ser e) inderminate .
Existe uma possibilidade, mesmo que pequena, de que haja um escalonamento na Thread “Main” entre a criação do “a” e a chamada “a.run()”.
Se você executar este código várias vezes (várias mesmo =) ) vai ver que eventualmente sai um ‘WorkerMain’.
Pelo que você disse, se te deram esta questão como errada, talvez fosse o caso de contestar a resposta onde você fez o exame…
LPJava
alan_parra:
Olá marcosurata,
A resposta correta deveria ser e) inderminate .
Existe uma possibilidade, mesmo que pequena, de que haja um escalonamento na Thread “Main” entre a criação do “a” e a chamada “a.run()”.
Se você executar este código várias vezes (várias mesmo =) ) vai ver que eventualmente sai um ‘WorkerMain’.
Pelo que você disse, se te deram esta questão como errada, talvez fosse o caso de contestar a resposta onde você fez o exame…
o problema que o exame nao fornece gabarito… como questionar?
sergiotaborda
O feeling é de que isto é correto, mas por outro lado, a thread iniciada - segundo a especificação da linguagem - só tem chance de executar run() quando houve 1) chamada a yield 2) chamada a sleep 3) a thread corrente terminar
Nenhuma destas 3 coisas acontece antes do método run ser invocado directamente, então, em principio a resposta certa (*) é que Heero Yuy já deu.
(*) A resposta está certa do ponto de vista da especificação da linguagem java, e portanto do ponto de vista da certificação. Se, atenção ao se, a JVM usada para correr o codigo permite , mesmo que com probabilidade abisurdamente pequena, que run() seja executado pela segunda thread sem que um dos 3 eventos acima descritos tenha acontecido isso é um problema/falha da JVM e não da linguagem E por conseqüência a JVM não estaria em concordancia com a especificação (bom, não sei qual seria o limite de tolerancia para uma situação assim).
A certificação é baseada naquilo que a especificação da linguagem, e não da JVM, exige. E nesse contexto a resposta certa é Main Worker.
Notem que uma coisa não invalida a outra.
R
RafaelVS
Uma das coisas que eu aprendi sobre Threads foi que não há especificação quanto à estratégia de escalonamento que a JVM deve utilizar… Assim sendo, se a JVM utiliza a estratégia de Time Slice (onde cada thread executa por um determinado período de tempo) poderia acontecer que no momento de rodar a linha a.run(); (onde seria impresso “Main”), o escalonador trocaria para a thread que foi criada no construtor da classe A e então, rodaria seu método run() (exibindo “Worker” primeiro).
Já se a estratégia foi não preemptiva, então o que o sérgio falou estaria correto, pois a troca de Threads só ocorreria ou quando a Thread corrente terminasse ou quando o programador explicitasse isso (chamando yield ou sleep). Nesse caso, imprimindo “Main Worker”.
Então, como há as duas possibilidades, acredito que a resposta correta seria a letra E, já que não seria possível determinar a saída correta.
alan_parra
sergiotaborda wrote:
Sergio, você poderia apontar em que trecho da especificação encontrou esta informação?
Ao meu ver, se a Thread iniciada só tem chance de executar quando houver uma chamada a sleep, yield, ou a corrente acabar, então não haverá paralelismo.
RafaelVS wrote:
Justamente, sempre que estudei o assunto a norma era: “não existe garantia na ordem de execução das Threads”.
Raff
Pessoa no primeiro codigo não tem como garantir nada a saida pode ser main worker ou worker main !
ViniGodoy
Tem, basta colocar o run() antes do start().
Como o run() roda na main thread, ele certamente vai rodar antes da outra thread iniciar.
ViniGodoy
E é isso mesmo. A resposta é letra E.
A saída pode ser tanto Worker Main como Main Worker
Só daria para garantir alguma coisa se o run() estivesse antes do start(). Aí a saída seria Main Worker.
Na verdade, esse é um bom exemplo do que não se deve fazer… como quase todo código nessas provas de certificação.
Raff
Vini sabe o que eu não entendi é como quando, onde causa a saida Main…
Raff
ah Vini eu entendi sim por que imprimi Main… tipo é porque no “thread main” eu chamo o a.run()… e quem está executando é o “thread main” :roll
Raff
É isso mesmo Vini ?
ViniGodoy
É isso mesmo.
O run() imprime o nome da CurrentThread, não o nome do Runnable. Por isso eu disse, é um comportamento confuso, exemplo do que não se deve fazer.
J2Alex
ainda que a probabilidade seja muito pequena da chamada direta ao método run ocorrer depois seja pequena, a possibilidade existe. Então a resposta correta é indeterminado.
De onde você tirou isso?
ViniGodoy
Também não creio que isso seja correto. Nesse caso, se estiver rodando 2 threads, uma só roda quando a outra termina?
Além disso, deve-se levar em consideração arquiteturas multi-core. Lá as threads podem efetivamente ser paralelizadas e tem direito ao processador mesmo que a outra ainda esteja rodando.