Dúvidas sobre threads (wait, notify e setPriority)  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
victorwss
JWizard
[Avatar]

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.
[MSN]
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
victorwss
JWizard
[Avatar]

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.
[MSN]
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
victorwss
JWizard
[Avatar]

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.
[MSN]
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

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
[WWW]
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team