Olá Galera,
Estou com um problema em um trabalho para a faculdade. A idéia é simular um roteador com 4 interfaces, cada uma delas com uma fila sendo alimentadas com “pacotes” pela sua respectiva thread. Há ainda uma outra thread que é o roteador em si, a qual retira os pacotes de todas as filas e os “encaminha” a porta correta.
Segue trechos do código.
//Thread1
for( int i = 0; i < 20; i++){
boolean sucesso = fila1.offer(pacote);
if (sucesso)
out.println(pacote+" pacote enviado ao roteador");//log pacotes gerados
else
out.println(pacote+" Descartado Fila cheia!!");//log pacotes gerados
}
//Thread2
for( int i = 0; i < 20; i++){
boolean sucesso = fila2.offer(pacote);
if (sucesso)
out.println(pacote+" pacote enviado ao roteador");//log pacotes gerados
else
out.println(pacote+" Descartado Fila cheia!!");//log pacotes gerados
}
//Thread roteador
while (!fila1.isEmpty() & !fila2.isEmpty()){
try{
pacote1 = (String) fila10.take();
pacote2 = (String) fila20.take();
out.println("Pacote "+pacote1+" roteado");//log do roteador
out.println("Pacote "+pacote2+" roteado");//log do roteador
}......
Em todas as threads eu uso um “sleep(x)” para simular os intervalos de chegada e saída dos pacotes ao roteador. Como podem ver o tamanho das filas é 10, mas eu gero mais pacotes em cada thread para simular o descarte de pacotes por buffer cheio.
O problema é que pacotes são inseridos nas filas e a thread “roteador” encerra antes de tratar alguns pacotes, como se as filas estivessem vazias. Em resumo é um problema de sincronismo que não consigo resolver.
Logs Gerados:
Pacotes Gerados
20.0.0.253 40.0.0.157 TTL=2 pacote enviado ao roteador
20.0.0.243 10.0.0.57 TTL=9 pacote enviado ao roteador
20.0.0.88 30.0.0.71 TTL=9 Descartado Fila cheia!!
20.0.0.238 40.0.0.253 TTL=5 Descartado Fila cheia!!
20.0.0.11 10.0.0.241 TTL=3 pacote enviado ao roteador [color=red]//este pacote ficou na fila2 e não foi tratado[/color]
20.0.0.221 40.0.0.252 TTL=3 Descartado Fila cheia!!
Pacotes Roteados
Pacote 20.0.0.253 40.0.0.157 TTL=2 roteado
Pacote 20.0.0.243 10.0.0.57 TTL=9 roteado
Se puderem me ajudar, agradeço.