Utilizando interface do Netbeans

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;
    }