| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/11/2007 21:05:48
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Se uma thread 1 encontra em sua execução um bloco de código synchronized cujo lock já foi obtido por outra thread 2, existe como a thread 1 pular a execução do código, ou seja, fazer a thread 1 desistir de ficar na fila para obter o lock?
Em outras palavras, existe como fazer um bloco de código ser executado apenas pela primeira Thread que obter o lock?
Eu preciso fazer uma barbearia. Os barbeiros são threads que percorrem a barbearia em busca de clientes esperando atendimento. Só que 2 barbeiros não podem verificar se um mesmo cliente está sendo atendido e barbeá-lo, então eu fiz esse trecho synchonized, só que assim um barbeiro fica esperando o outro terminar para verificar que o cliente em questão foi barbeado, quando deveria partir pra outro.
Tá aqui o código, a parte sincronizada tá na linha 76:
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/11/2007 18:24:47
|
Marcio Biza
Thread.start()
Membro desde: 03/11/2007 16:50:31
Mensagens: 26
Localização: Rio de Janeiro
Offline
|
Apenas lendo o problema, pensei na seguinte forma: cria uma váriavel estática booleana que verifica se ja tem um barbeiro atndendo o cliente. Dessa forma o barbeiro só chama o método se o cliente estiver livre. E quando ele começa a atender o cliente ele muda o valor do boolean.
[]'s
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/11/2007 20:46:10
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Lê de novo.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/11/2007 01:14:45
|
rubinelli
JavaEvangelist
![[Avatar]](/images/avatar/5e15fb59326e7a9c3d6558ca74621683.jpg)
Membro desde: 26/04/2005 11:18:25
Mensagens: 469
Offline
|
Renato, o que você está procurando é uma work queue. É uma maneira bem simples de montar um pool de threads para, por exemplo, servir requisições HTTP.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/11/2007 17:52:01
|
Marcio Biza
Thread.start()
Membro desde: 03/11/2007 16:50:31
Mensagens: 26
Localização: Rio de Janeiro
Offline
|
Cara, li de novo e li tudo agora!
O que te falei funciona, e a sua solução também! O problema é que você está colocando a operação de barbear dentro da verificação. Muda seu código para a seguinte forma e testa:
Ve se funciona. A worker thread sugerida acima também funciona.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/11/2007 20:16:33
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Recomeçei tudo do zero sem threads e agora acho q resolveu....
Um lance novo agora é que tem uma hora que eu tenho que chamar run() direto porque senão a thread vai startar recursivamente
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/11/2007 04:57:52
|
Ironlynx
Moderador
![[Avatar]](/images/avatar/93d65641ff3f1586614cf2c1ad240b6c.jpg)
Membro desde: 02/05/2003 01:06:41
Mensagens: 3515
Localização: The other side of the screen
Offline
|
Um lance novo agora é que tem uma hora que eu tenho que chamar run() direto porque senão a thread vai startar recursivamente
Opa, tem truta aí...posta o código!Será que não há uma thread "roubando" o lock antes da hora?
|
Não basta persistir...tem que prevalecer!
Ironlynx
Anarquista de Sistemas
http://osereojava.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/11/2007 13:05:41
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
É tipo assim: a primeira vez que o barbeiro atende, tem que ser um start(), pois quando ele termina, ele mesmo vai puxando os outros da fila, ao contrário do primeiro cliente que é "empurrado" pra ele. O start é para que não fique apenas um barbeiro trabalhando e os outros parados. Só que nos próximos clientes eu tenho que chamar o método de barbear de novo para outro cliente, e como a thread já está rodando, eu chamo run() diretamente:
This message was edited 2 times. Last update was at 26/11/2007 13:38:11
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/11/2007 21:07:17
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
this.up(ironlynx)
|
|
|
 |
|
|