Devaneio thredáticos  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
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:

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
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Lê de novo.
rubinelli
JavaEvangelist
[Avatar]

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.
[WWW]
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.
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
Ironlynx
Moderador
[Avatar]

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/
[WWW]
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

renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

this.up(ironlynx)
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team