Tem que olhar o método fill(), que deve ser o que bloqueia… um thread geralmente é um loop infinito… o que ele precisa são break points (return ou break) ou pontos de interrupção… (que respondem ao interrupt() jogando uma InterruptedException)
Aí tem que ver se o método in.read( … ) pode ser interrompível…
Melhor simplesmente fazer um teste e chamar thread.interrupt() e ver se funciona… se não vc vai ficar procurando agulha em palheiro… pelo que escreveram lá no StackOverflow parece que não funciona não, o que é estranho…
Então a thread não está morrendo, tá ficando travada ad eterna. Naquele post do stack overflow o pessoal estava reclamando exatamente disso. Parece que para destravar o readLine só fechando o stream que ele está escutando OU mandar um EOF marker.
Galera, só para compartilhar com vocês, resolvi o problema, não sei se é da forma correta.
Quando que parar de receber as mensagens, fecho a conexão com o servidor e seta a flag para false. Assim Quando o servidor detecta que a conexão com o cliente fachou, ele também fecha o fluxo, assim acontece uma Exception na Thread do cliente,
continuando o while, com a flag False ele finaliza a Thread.
Dessa forma cheguei a meu objetivo.
while (ativo) {
try{
String msg= reader.readLine();
}catch(Exception e){
if(ativo){
//notifica listener que ocorreu uma exceção
}
}
}
public void finaliza(){
connection.close(); //Fecha conexão
ativo = false;//altera flag
}
Cata a InterruptedException ao invés de Exception lá… É ela que diz se o thread foi interrompido após o fechamento da conexão. Vc não quer ignorar uma exception real aí.
Outra coisa que vc deve fazer é primeiro setar a flag e depois fechar.