Pessoal… estou com o seguinte problema:
Meu programa possui duas threads que rodam e ficam setando um grid numa interface feita no NetBeans. é o velho problema do Produtor/Consumidor.
Tem duas maneiras de setar a produção. Uma na mão ao digitar qualquer coisa no teclado e outra através da thread. Ambas chamam a msma função. Porém quando utilizo a atrelada ao evento KeyPressed ele funciona normalmente, mas quando chamado pela thread não. Daí quando digito outra letra o grid atualiza todos os valores incluindo os da thread. O que mostra que o problema não está na thread em sim.
Essas duas classes consumidor e produtor ativadas no Main()
//----------------------------------------------------------
class Consumidor extends Thread {
Semaphore s1;
public Consumidor(Semaphore a) {
s1 = a;
}
@Override
public void run() {
int tempo = 0;
while (true) {
try {
Thread.sleep(ex.getValue_Consumidor() * 1000);
s1.acquire();
ex.setarConsumidor();//---------------------------> Aqui ele chama a função da classe Janela e executa. Porém nao atualiza a janela
ex.repaint();
} catch (InterruptedException ex) {
Logger.getLogger(Consumidor.class.getName()).log(Level.SEVERE, null, ex);
}
s1.release();
}
}
}
//------------------------------------------------------------------------
public class Produtor extends Thread {
Semaphore s1, s2;
public Produtor(Semaphore a) {
s1 = a;
//s2 = b;
}
@Override
public void run() {
int x = 1;
while (x > 0) {
if (ex.getAutomatico() == true) {
try {
Thread.sleep(ex.getValue_Produtor() * 1000);
ex.setarProdutor('P');//--------------------------->Setando p no grid, porém nao atualiza o grid.
ex.repaint();
} catch (InterruptedException ex) {
Logger.getLogger(Produtor.class.getName()).log(Level.SEVERE, null, ex);
}
}//fim if
s1.release();
}//fim while
}
}
//-----------------------------------------------------------------------
//NA CLASSE JANELA EXISTEM AS FUNÇÕES:
//-------------------------------------------------------------------------
//ESSA FUNÇÃO ESTA ATRELADA AO GRID COM O EVENTO DE KeyPressed - toda vez que o cara digita ele aparece no grid e atualiza certin
private void gridMemoriaKeyPressed(java.awt.event.KeyEvent evt) {
char c =evt.getKeyChar();
setarProdutor(c);
}
//-------------------------------------------------------------------------
//ESSA FUNÇÃO É CHAMADA PELO ATO DE DIGITAR UM CARACTERE COMO NA FUNÇÃO ACIMA E PELA THREAD
//Acontece que quando acessada pela thread ela é executada. Isso é confirmado pelas saídas dos prints que dei. No entanto
//as funções relacionadas a interface nao atulizam a janela. Como a gridMemoria.setValueAt(x,x,x)
//só estão atualizando a janela quando executo através do gridMemoriaKeyPressed
public void setarProdutor(char c) {
System.out.println("Produtor");
if(inicio < 14 && vet[inicio+1]!= null){
filaCheia.setVisible(true);
System.out.println("Fila Cheia");
}
else if(inicio == 14 && vet[0]!= null){
filaCheia.setVisible(true);
System.out.println("Fila Cheia");
}
else{
valor_semaforo++;
if(inicio < 15){
vet[inicio] =c;
for(int i=0; i < 15; i++){
gridMemoria.setValueAt(vet[i], 1, i);
}
gridMemoria.setValueAt("P", 0, inicio);
if(inicio != 0)
gridMemoria.setValueAt(" ", 0, inicio-1);//setando col anteriores com vazio
else
gridMemoria.setValueAt(" ", 0, 14);//setando col 14 com vazio após passar por ela
inicio++;
}//fim if
}//fim else
if(inicio ==15)
inicio =0;
}
//==========================================================================
public int getValue_Produtor(){
return produtor_value;
}
//=========================================================================
public void setValue_Produtor(int tempo){
produtor_value = tempo;
}
//=========================================================================
public void setarConsumidor(){
System.out.println("Consumidor");
filaCheia.setVisible(false);//remove aviso de fila cheia
System.out.println("FIM - "+ fim);
if(vet[fim] != null){
vet[fim] = null;
valor_semaforo--;
for(int i=0; i < 15; i++){
gridMemoria.setValueAt(vet[i],1 ,i);
}//fim for
gridMemoria.setValueAt("C", 2 ,fim); //atribui caption C na tabela
if(fim != 0)
gridMemoria.setValueAt(" ", 2, fim-1);
else
gridMemoria.setValueAt(" ", 2, 14);
fim++;
}//fim if
if(fim == 15){
fim=0;
}//fim if
}
//=========================================================================
public int getValue_Consumidor(){
return consumidor_value;
}
//=========================================================================
public void setValue_Consumidor(int tempo){
consumidor_value = tempo;
}