Variavel comum a duas threads

3 respostas
Z
Olá, estou tentando fazer o seguinte: O primeiro código vai realizar uma função, nesse caso vai mudando o valor da variavel t
public class A implements Runnable{
    public static int t;
     public void run () {
       
           try {
               for (int i = 0; i <= 10000; i++) {
t=i;
this.t = t;
System.out.println(t);
               Thread.sleep(10);}
           } catch (InterruptedException ex) {
               Logger.getLogger(A.class.getName()).log(Level.SEVERE, null, ex);
           
       }
      
  }
     public int p(){
       
         return t;
}
      
}

E em outra classe eu gostaria de usar a mesma variavel:

public class B implements Runnable{
    
     A A= new A();
     int t=0;
    
     public void run () {
        
  
         try {
     t=A.p();
      while(true){
System.out.println(t);
             Thread.sleep(10);}
         } catch (InterruptedException ex) {
             Logger.getLogger(B.class.getName()).log(Level.SEVERE, null, ex);
         }
}
     
}
e depois na classe principal eu chamo os dois um Threads
A mp= new A();
       B mp2= new B();
      
      
        Thread Mp00 =new Thread(mp);
        Thread Mp01 =new Thread(mp2);
        
        Mp00.start();
               Mp01.start();
mas o valor da variavel t que chega na classe B é 0, como eu faço pra arrumar isso?

3 Respostas

V
a) Classe para guardar o valor que será compartilhado (precisa ser uma classe pois o java faz cópias de tipos primitivos)
public class Valor {
   private int valor;
   public synchronized int getValor() { return valor; }
   public synchronized void add() { valor++; }
}

b) Runnable para atualizar o valor:

public class Atualizador implements Runnable{
    private Valor valor;

    public Atualizador(Valor valor) {
        this.valor = valor;
    }

    @Override
    public void run () {
        try {
            for (int i = 0; i &lt;= 10000; i++) {
                valor.add();
                Thread.sleep(10);
            }
        } catch (InterruptedException ex) {
            System.err.println(&quot;Thread interrompida&quot;);
       }
    }
}
c) Runnable para imprimir o valor:
public class Impressora implements Runnable{
    private Valor valor;

    public Impressora(Valor valor) {
        this.valor = valor;
    }

    @Override
    public void run () {
        try {
            for (int i = 0; i &lt;= 10000; i++) {
                System.out.println(valor.getValor());
                Thread.sleep(10);
            }
        } catch (InterruptedException ex) {
            System.err.println(&quot;Thread interrompida&quot;);
       }
    }
}
d) Cria os dois runnables para o mesmo valor e dispara-os em threads diferentes:
try {
    //Criação da variável compartilhada
    Valor valor = new Valor();
    //Criação das threads
    Thread t1 = new Thread(new Atualizador(valor));
    Thread t2 = new Thread(new Impressora(valor));
    t1.start();
    t2.start();
    //Espera as threads acabarem
    t1.join();
    t2.join();
} catch (InterruptedException e) {
    System.err.println(&quot;Threads interrompida&quot;);
}
V

No caso específico do seu código, talvez passar a linha:

t=A.p();

Para dentro do while ajude.

Entretanto, reescrevi as classes pois você recheou o código de péssimas práticas:

a) Indentação incorreta;

b) Uso de variável estática;

c) Separação pouco clara da funcionalidade das classes;

d) Maus nomes de classes e variáveis.

Threads já são um assunto suficientemente complexo por si só.
Não complique ainda mais sendo desleixado com seu código.

Z

Nossa muito obrigado, sou iniciante, mas vou tentar me ligar mais nesses detalhes, vlw aí =)

Criado 16 de junho de 2013
Ultima resposta 16 de jun. de 2013
Respostas 3
Participantes 2