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???
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á”