Resolvido

Tenho uma classe que extende Thread, ela se conecta a um servidor e efetua o login no Run() como no código abaixo:

      address = InetAddress.getByName(host);
      connection = new Socket(address, port);
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));

      String msg = "Login:User:Senha\r\n";

      out.write(msg);
      out.flush();

Isso funciona normalmente, após este write e flush consigo mandar mais mensagens para o servidor com o write e o flush. O problema é que:

Preciso mandar outras mensagens nesta mesma classe porém fora do método Run(), mas sempre gera algum tipo de erro, alguem sabe o que pode ser?
Obrigado.

É pq a thread morre e os objetos declarados dentro do metodo run morrem tb.
Tente fazer o seguinte:

class abc extends Thread{
    private  BufferedWriter out = null;
    //Aqui vão os outros objetos

    //Instancia esses caras no construtor
    abc(){
        address = InetAddress.getByName(host);
        connection = new Socket(address, port);
        out = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); 
     }
     public void enviaDados(String msg){
         out.write(msg);
         out.flush(); 
     }
     public void run(){
         String msg = "Login:User:Senha\r\n"; 
         enviaDados( msg );
         while(true){
             int read = out.read(buffer);
             System.out.println( new String(buffer, 0, read) );
             //Tem que circular com try...catch
             Thread.sleep(100);
         }

     }
}

Pronto, agora vc pode chamar o metodo enviaDados em qualquer momento.
Dentro do metodo run é bacana colocar uma variavel de controle para quando vc mandar o sistema finalizar ele altera o estado desta variavel. Lembre-se de declarar esse flag como volatile senão outra thread não consiguirá muda-la.

Ex: volatile boolean bRun = true;

Muito obrigado deu certinho.