olá estou precisando criar um programa de threads sincronizadas. uma thread deve contar até 10 e a outra deve contar até 20, e a cada cinco valores contados deve imprimir o nome da thread e quantos numeros faltam para acabar a contagem.
mais ou menos assim, eu acho, mas aí vem minha dúvida não deveriam ser sincronizadas essas threads?
E
entanglement
Pois é, que tipo de sincronização você quer fazer? Você só precisa sincronizar threads se elas acessarem um recurso comum cujo acesso deve ser sincronizado, a fim de que não fique alguma coisa inconsistente ou incoerente. No seu caso, o que o professor lhe pediu?
S
spiderman
Escreva um programa concorrente formado por duas threads (?A? e ?B?), que possuem suas ações sincronizadas. Uma das threads conta até 10, e então deve esperar pela outra que conta até 20, e vice-versa. Considere que a execução começa pela thread que conta até 10. A cada 2 valores contados pelas duas threads, o programa deverá escrever uma linha indicando qual thread alcançou a marca e quantos valores ainda faltam ser contabilizados.
E
entanglement
Ah, agora sim você está falando direito o que você quer (lição de casa).
No seu caso, como você não pode usar aquelas APIs do java.util.concurrent (não está escrito no enunciado, mas provavelmente o professor não irá aceitar), provavelmente você terá de usar um lock.
No seu caso, você provavelmente terá de usar “wait” e “notify” (argh).
S
spiderman
mas se seu fizer mais ou menos assim:
E
entanglement
Rode, e veja que não vai funcionar. Por que é que não funciona? Dica: não adianta usar o “synchronized” nesse ponto.
S
spiderman
nao entendi. pode me explicar?
E
entanglement
Desculpe, não tinha analisado direito seu programa. Como há apenas uma instância da classe Counter, então deve haver a sincronização desejada.
Entretanto, por um motivo um pouco desagradável, você vai ver que às vezes a thread 2 vai começar seu trabalho antes da thread 1, e então a solução que você apresentou não satisfaz plenamente ao proposto por seu professor.
(Não é porque t2.start vem depois de t1.start que a thread 1 vai sempre começar antes da thread 2. Para termos essa sincronização é preciso fazer algo explícito.)
E
entanglement
A forma mais estúpida de fazer com que a thread 2 comece depois da thread 1 é fazer com que a thread 1 inicie a thread 2.