| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/02/2009 21:49:26
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Olá Pessoal.
Estou na reta final dos estudos para o SCJP 6, que será nesta quarta-feira. Hoje eu concluí o livro e estou com uma série de dúvidas hehe. Vou citar as dúvidas, os exemplos que fiz, não funcionaram. Primeiro, testando o notify() e wait():
Classe ThreadB
Classe ThreadA
Por que a classe trava em "Esperando b completar..."?? Não era para o notify() liberar o recurso?
A outra dúvida com thread, é na parte do setPriority, como é mostrado abaixo:
Classe Contador
Classe TestePrioridade
A outra dúvida é... Se eu setei o t2 como prioridade máxima, ele não deveria executar primeiro que o t1?
Essas foram algumas dúvidas sobre threads que eu obtive ao estudar o livro. Se alguém puder me ajudar, ficarei muito grato.
Abraços.
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 08:27:26
|
victorwss
JWizard
![[Avatar]](/images/avatar/4ab232445f9b21b65dfdf6ea5f27f704.png)
Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline
|
1) Não há nada em ThreadA e ThreadB que garanta que o notify() ocorra antes do wait. Se o notify ocorrer antes do wait, provavelmente o seu programa vai travar.
2) Não confie em prioridade de Threads. O sistema operacional pode ignorá-las por completo se ele quiser. Além do mais, System.out.println é relativamente lento e tem gargalos de desempenho que podem fazer uma Thread esperar, pois ele precisa sincronizar internamente para garantir a consistência do texto escrito na saída.
Elimine o System.out interno das suas Threads que daí as prioridades podem fazer mais sentido, se o sistema operacional quiser.
Ah, e poste este tipo de dúvida no fórum de certificação. Lá você conseguirá respostas melhores e mais rapidamente.
This message was edited 3 times. Last update was at 02/02/2009 08:30:51
|
Victor Williams Stafusa da Silva
Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.
Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.
Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.
É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
Se você escreve "concerteza", "concerteza" você andou matando aulas de português. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 08:32:47
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Hum, entendi sobre prioridade, eu vou fazer o teste depois.
Então, quanto ao notify(), se eu der o b.start() depois do bloco synchronized, vai funcionar?
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 08:36:47
|
victorwss
JWizard
![[Avatar]](/images/avatar/4ab232445f9b21b65dfdf6ea5f27f704.png)
Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline
|
Pilantra wrote:Hum, entendi sobre prioridade, eu vou fazer o teste depois.
Então, quanto ao notify(), se eu der o b.start() depois do bloco synchronized, vai funcionar?
Não. pois ele vai chegar no wait antes que a outra Thread comece. Como a outra Thread não começou, ela não vai poder dar notify.
|
Victor Williams Stafusa da Silva
Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.
Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.
Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.
É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
Se você escreve "concerteza", "concerteza" você andou matando aulas de português. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 08:41:22
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Putz, então como resolveria isso? Meio complicado esse negócio do notify.
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 08:47:32
|
victorwss
JWizard
![[Avatar]](/images/avatar/4ab232445f9b21b65dfdf6ea5f27f704.png)
Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline
|
Pilantra wrote:Putz, então como resolveria isso? Meio complicado esse negócio do notify.
Quando você dá um wait, é porque teoricamente você está esperando acontecer alguma coisa. A documentação do método wait diz que é recomendado que ele seja colocado dentro de um while.Assim, você elimina dois problemas:
1) O problema de o notify ocorrer antes, pois teoricamente você só dá o notify (ou notifyAll) depois que essa coisa aconteceu. Assim, se tiver alguém esperando essa coisa, esse alguém vai acordar. Se ninguém estiver esperando ainda, então nem vai esperar.
2) As vezes o wait pode acordar de forma espúria (sem ser notificado). Em geral isso pode ocorrer se o sistema operacional não tiver um controle de thread bom, e para evitar isso, é recomendado usar aquele while, pois se o wait acordar de bobeira, ele volta a dormir.
Enfim, leia a documentação dos métodos wait, notify e notifyAll.
|
Victor Williams Stafusa da Silva
Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.
Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.
Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.
É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
Se você escreve "concerteza", "concerteza" você andou matando aulas de português. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 09:30:51
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Valeu cara!! Ajudou muito.
Abraços!
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 10:47:52
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Pilantra wrote:
Por que a classe trava em "Esperando b completar..."?? Não era para o notify() liberar o recurso?
embora se chame "wait" o método não serve para esperar. O metodo wait trava enquanto o notify não for dado.
( wait significa : espera o notify) . Use notifyAll em vez de notify. Isso e uma boa pratica de trabalho com threads.
Para executar um trabalho enquanto a outra thread corre e esperar por ela no fim use join() e não wait().
A outra dúvida é... Se eu setei o t2 como prioridade máxima, ele não deveria executar primeiro que o t1?
Não. O modelo de threads do java ( não tem nada a haver com OS) não garante nenhum tipo de ordem ao correr os threads.
A prioridade não significa que vai correr primeiro, significa que vai correr mais vezes.
No modelo de threads o tempo do porcessador é dividido pelo numero de threads presentes , pesado pelas suas prioidades.
Portanto, se todos tem a mesma prioridade, cada um ganha o mesmo tempo de execução por ciclo. Mas se a prioridade é maior ele ganha maior tempo por ciclo. Quanto tempo não é garantido, portanto, na realidade a prioridade pode ser ignorada.
Veja a priopridade como um dica para a JVM e não como uma obrigação da JVM.
Lembrar que o modelo de threads do java não tem nada a haver com o modelo de thread do OS nativo. A JVM pode converter Threads java em threads nativas, mas não é obrigada a isso. Normalmente a JVM não faz isso.
A separação é improtante, porque mesmo em OS que nao suportam multiprocesso é possivel ter uma JVM com threads (aliás essa é umas vantagens principais do modelo de threads da JVM)
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 12:44:03
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Valeu sergiotaborda. Matou minha dúvida.
Abraços.
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
|
|