Como finalizar certa thread?

olá…

tenho uma thread que fica aguardando receber dados de um canal de comunicação, o run esta mais ou menos assim:

public void run()
{
while(true)
{
String s = in.readUTF();
jtextField.setText(s);
}
}

entao, pra quem sabe socket deve saber que nesta linha “String s = in.readUTF();” ele fica parado ateh receber alguma coisa…

agora, da thread Principal (main), como finalizar esta thread?
todos os metodos que vi estao deprecated…

agradeço muito a todos =D

Pergunta - será que dá para usar Thread.interrupt? Nesse caso, você tem de checar se o socket é interrompível url=http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/SocketChannel.html[/url]

Faça o seguinte:

public void run() { //Testa se o interrupt não foi dado try { while(!Thread.interrupted()) { String s = in.readUTF(); jtextField.setText(s); } } catch (IOException e) { //Loga que sua thread foi interrompida devido a exceção } }

Agora, é só dar um interrupt() na thread. Outra opção seria fechar o socket, o que causa uma IOException no read.

Agora, no Java, não existe um comando para arbitrariamente matar uma thread. A única forma segura de fazer isso é fazer com que seu código saia do método run() naturalmente.

Eu lembro que vi no site da Sun a seguinte recomendação:

class ThreadTeste extends Thread {
     Boolean execute = true;

     public setExecute(Boolean execute){
         this.execute = execute
     }

     public void run() {
          while(execute){
               //faz algo
          }
     }
}

public class Teste {
    public static void main(String[] args) {
         ThreadTeste t = new Thread();
         t.start();
         //caso queira interromper
         t.setExecute(false);
    }
}

Porém no caso da leitura do socket ele irá ficar aguardando até o socket receber algo, creio q só parar o while não deve adiantar, se fechar a conexão talvez ele pare… já fez esse teste?

Sim mas…

  1. A variável execute tem que ser acessada só em trechos synchronized ou ser declarada como volatile;
  2. É melhor que ela seja um tipo primitivo (boolean) e não um Boolean;
  3. Alterar o estado da variável execute também não vai liberar um socket ou sair de sleep ou wait. Para isso, só interrupt().

assim q eu chegar em ksa testarei isso tudo…

muito obrigado por enquanto :wink: