Threads e variaveis

4 respostas
M

Olá pessoal, me desculpem por vir mais uma vez incomodar com mais uma dúvida, bem ela é sobre Threads e se haveria alguma forma de uma thread enviar dados para outra, exemplo Thread A envia 'a Thread B a String C.
Procurando no google achei apenas um pequeno comentário sobre colaca-las em um ThreadGroup, depois chamar o método enumerate para lista-las e assim chamar o método desta thread que assim enviaria esta variável.
Se alguém puder me dar um exemplo de como realizar esse envio, ficarei agradecido.
Obrigado antecipadamente.

4 Respostas

V

Duas threads podem percorrer o mesmo objeto, nesse caso, elas estarão compartilhando memórias e, por consequência, enviando dados umas para as outras.

V

Um exemplo simples:

public class ExemploThread {
    public static void main(String args[]) throws InterruptedException
    {
        //O código do main roda na thread principal.
        //Ainda na thread principal, vamos criar um contador.
        Contador c = new Contador(333);
        //Vamos criar uma segunda thread, para fazer esse contador girar.
        Thread threadContador = new Thread(c, "ThreadDoContador");
        threadContador.start();

        //Podemos fazer a main thread perguntar o valor do contador
        System.out.println("O contador está em:" + c.getNumero());
        
        //Vamos dormir alguns segundos, e deixar o contador rodar. E então
        //perguntar novamente o valor do contador.
        Thread.sleep(1476);
        System.out.println("O contador está em:" + c.getNumero());
        
        //De novo!
        Thread.sleep(1476);
        System.out.println("O contador está em:" + c.getNumero());

        //Agora vamos fazer a main thread pedir para o contador parar
        threadContador.interrupt();
        Thread.sleep(200);
        System.out.println("Programa finalizado!");        
    }
}

class Contador implements Runnable
{
    private long intervalo;
    private volatile int numero;

    public Contador(long intervalo)
    {
        this.intervalo = intervalo;
        this.numero = 0;
    }

    public void run() {
        try {
            while (!Thread.interrupted())
            {
                numero = numero + 1;
                Thread.sleep(intervalo);
            }
        } catch (InterruptedException e) {}
        System.out.println("Contador finalizado!");
    }

    public int getNumero() {
        return numero;
    }
}

Note que aqui a thread main se comunicou com a thread contadora, pois ambas conheciam o objeto Contador. A thread contadora estava percorrendo o Runnable, enquanto a thread main perguntava informações para esse Runnable. Seria possível também fazer a thread main usar sets no Runnable, que seriam vistos pela thread contadora.

Agora, quando threads se comunicam, é quando começa os problemas de se trabalhar com threads. É aqui que começa a se tornar importante conceitos como sincronização, semáforos e filas de mensagens.

M

Obrigado.
Fiquei chocado como era simples e eu não havia visto :shock:
O problema era que eu estava tentando criar varias threads da mesma class e não conseguia ver o modo de modificar o valor de apenas uma delas quando fosse necessário.
Não sei se fui claro na explicação, mas sua resposta resolveu meu problema, obrigado novamente.

V

Olha, toma cuidado com uma confusão comum entre os iniciantes de programação em threads.

Thread é a linha de execução. É o seu programa “rodando”.

A classe Thread apenas o disparador. Ela inicia a thread, e obtém informações sobre ela, mas não é a thread.

E o Runnable, é a apenas uma interface, que indica onde a thread começa.

O objeto que você monta sobre essa interface, também não é a thread. Duas threads podem, ao mesmo tempo, percorrer até mesmo o mesmo Runnable. Como é o caso do exemplo. A main thread poderá ler o valor da variável numero, ao mesmo tempo que a thread do contador está dormindo no método run.

Muitas confusões são evitadas quando esses conceitos estão bem separados.

Criado 5 de janeiro de 2010
Ultima resposta 6 de jan. de 2010
Respostas 4
Participantes 2