Porque Thread nao Imprime novo valor da Variavel quando alterada?

Este programa fica imprimindo o valor de uma variavel a cada 1/2 segundo. No programa principal eu posso mudar o valor da Variavel atravez de um JOptionPane.
O Problema: Quando eu mudo o valor da Variavel, a Thread nao faz a atualização e continua imprimindo o valor inicial da Variavel.
Como eu posso Resolver este Problema???



1 curtida

Porque e’ uma nova Thread em nova instancia.

Se voce quer que sua Thread Contador mude o valor de y , ou você passa para ela a referencia de um Object onde y fica dentro dele ou simplesmente dentro da Thread altera o valor de y, tipo assim :

variavel = Integer.parseInt( JOptionPane ...
x.y = variavel;

Outro detalhe, 1 segundo e’ igual 1000 milesimo de segundo, logo se quer meio segundo são 500 e não 750.

Porem a Thread não te garante a exatidão de precisão quando se manda ela dormir e depois acordar, pois existe uma fila de execução no proprio SO e tambem na JVM.

Entendi. Quer dizer que no meu exemplo eu mandei para a thread uma instancia do objeto “variavel”, ou seja, uma copia. E entao toda vez que eu altero a “variavel” original atraves do joptionpane a instancia nao muda.

E porque quando eu declaro a “Variavel” fora do metodo (logo avaixo da linha 6) ela tem que obrigatoriamente ser Static na declaração???
O eclipse não aceita se ela nao for Static.

Quem controla isso em si’ e’ plataforma java, entendendo o conceito de compilar e rodar em um padrão java.

Em relação a tipos primitivos, quando manda por parametro sim ele faz uma copia da variavel que funcionara’ independente daquela que originou, diferentemente de quando se passa uma instancia de um Objeto.

Quanto a programação java em si, você pode criar variaveis dentro da classe, do construtor e dos metodos, ou seja, não precisa ser dentro do metodo principal de chamada do main.

A priori a instancia de java se faz usando new …, mas pode ser atraves de reflection exemplo :
Class.forName(“classe”).getConstructor(String.class).newInstance("…");

Em relação a static e’ bem simples de se entender, você pode chamar um metodo qualquer declarado como static onde não precisa instanciar o Objeto.

Bons Codigos

vamos la

vc chama de “variavel” pq provavelmente não entendeu o conceito de objetos e seus atributos.

se vc declara uma variavel fora de um metodo, vc esta declarando um atributo que pode pertencer a instancia ou a classe ( essa ultima recebe o modificador static ).

agora vamos ver o que acontece com o seu codigo: vc recebe uma variavel ‘contador’. e depois reatribui a este contador um outro valor. por que razão vc espera que o objeto saiba disso?

sério?

se vc faz

variavel = uma coisa;
objeto.qqCoisa( variavel );
variavel = outra coisa;

o objeto não sabe disso. e não tem pq saber. a unica forma de fazer é usando orientação a objetos

mas como?

variavel = um objeto mutavel;
objeto.qqCoisa( variavel );
variavel.algumMetodoQualquer();

se o seu objeto guardou uma referencia ao objeto, chamar um metodo que mude o estado interno do mesmo vai ser propagado.

o que é um objeto mutavel?

um objeto possui um estado e este estado pode mudar ou não. um objeto que represente o valor 1 ( um ) talvez não faça sentido mudar pois… ele representa o 1! mas um objeto como um Aluno pode ter uma nota alterada.

Strings e Wrappers para os tipos primitivos numericos são imutaveis. alias tipos primitivos não são objetos, mas vc tem autobox e pode criar um objeto que contem o numero

int i = 0;
Integer j = new Integer(0);

nesse caso j é um objeto ( um Integer ) mas i é um tipo primitivo inteiro ( não tem metodos ).

portando pense bem: vc precisa de um objeto mutavel que contem um numero.

por exemplo o seu contador pode ser

public class Contador implements Runnable {
   private int c;

   public Contador( int c) { this.c = c;}

   public void incrementa(int x) { c += x; }

   public int mostra() { return c; }
   ...
}

perceba que vc não precisa da variavel

Contador x = new Contador(5);
new Thread(x).start();
while(true){
  System.out.println("contador agora tem " + x.mostra());
  int tanto = /*aquele parseInt maneiro vindo do JOptionPane... */
  x.incrementa( tanto );
}

magica? não é orientação a objetos. vc pensa em ‘variaveis’ como em programação procedural e ai não pesca a essencia da coisa.

Poxa, que aula!!! Mais claro do que esta explicação impossivel.
Valeu mesmo!!!

então

SALVO ENGANO, em C++ é possivel fazer algo parecido com o que vc estava programando usando referências. Mas C++ é uma linguagem multi paradigma então “em se plantando tudo dá”