Problema com threads

tenho duas classes cada uma com uma thread o codigo está abaixo das duas gostaria de saber pq elas não funcionam quando chamo o método que tem por função dá inicio a thread esse método de inicio é chamado no método decide que implementei na main, agora se ponho no construtor ó start ela inicia mas não pelo método decide e sim pq declarei uma instância da classe JAluno ou JPC no Main, e outra coisa quando ela entra no run do JAluno como faço pra que depois que ele execute sua função dê vez ao run de JPC se puderem ajudar é urgente as classes tão abaixo
public class Main{

JAluno aluno = new JAluno();

 JPC pc = new JPC();

private Graphics g;    


 public void decide(){
   
    while(true){ 
        if (aluno.jogadaAluno)
            aluno.iniciaAluno();
       
        else
            pc.iniciaPC();
    }
}


public static void main(String args[]){
   new TelaDeJogo();
   Main m = new Main();
   
   
        m.decide();
      
 }

}

public class JPC implements Runnable{

/**
 * Cria uma variável que será utilizada na 
 * criação da Thread
 */
private Thread runner1;

/**
 * Variável utilizada como parâmetro na chamada do método desenha de TelaDeJogo
 */
private Graphics g;



/**
 * Cria uma variável de JAluno utilizada na chamada de métodos desta classe
 */
JAluno aluno;

/**
 * Instância que acessará o método desenha
 */  

// Jogada ctrlJ = new Jogada();

 public void iniciaPC(){

    if (runner1 == null) {
        runner1 = new Thread(this);
        runner1.start();
    }        

}


public synchronized void run(){

if(aluno.jogadaA())
{
        try {
            runner1.sleep(20000);
        }catch (InterruptedException ex) {
            ex.printStackTrace();
        }  
	
    }
                    
    //chama o método que efetua a jogada do PC
    else{
         JOptionPane.showMessageDialog(null,"tem");
        // ctrlJ.desenha(g);
         aluno.jogadaAluno = true;
    }
        
}

}

public class JAluno implements Runnable{

/**
 * Variável utilizada na chamada do método jogada de JPC
 */
JPC comp;

/**
 * Cria uma variável que será utilizada na 
 * criação da Thread
 */
public Thread runner = new Thread();

/**
 * Variável que será utilizada pela classe JPC para verificar
 * se o Aluno está efetuando jogada num dado instante
 */
public boolean jogadaAluno = true; 

/**
 * Variável utilizada como parâmetro na chamada do método desenha de TelaDeJogo
 */
private Graphics g;

/**
 * Instância que acessará o método desenha
 */

// Jogada ctrlJ = new Jogada();

public void iniciaAluno(){

    if (runner == null) {
        runner = new Thread(this);
        runner.start();
    }        

}


/**
 * Houve a jogada do PC e caso o mesmo já tenha efetuado sua 
 * jogada permite a jogada do aluno que é carregada na tela.
 */
public void run(){
    
    //espera o PC efetuar a jogada enquanto jogada aluno for false
    while(true){
        
        if (!(jogadaAluno)){
        
            try {
                runner.sleep(20000);
            }catch (InterruptedException ex) {
                ex.printStackTrace();
            }  

        }
        
       
        //chama o método que efetua a jogada ou seja que pega os pontos e pinta o plano na tela
        else{
           // ctrlJ.desenha(g);
            JOptionPane.showMessageDialog(null,"tem que dá certo");
            jogadaAluno = false;
        }
        
   }

}

public boolean jogadaA() {
    return jogadaAluno;
}

}

puts, to sem paciencia nenhuma hj, mas teu código tá meio confuso e por isso acho que ninguem ia te responder… ai resolvi ver…

não entrando na avaliação da sua lógica, se tá certa ou errada (eu particularmente achei bem estranho), o fato de não executar as threads qdo vc executa dentro de decide() é porque você só inicia a thread do aluno se a variavel runner esta nula:

		if (runner == null) {
			runner = new Thread(this);
			runner.start();
		}

e no caso a classe do aluno ja inicia esse runner quando é criada:

public Thread runner = new Thread();

logo, runner ja tem valor, tira esse new la da declaração que então vai executar.

mas como eu disse, eu só vi porque não executou a thread, acho que tah muito estranho seu código só que realmente hj to sem cabeça de ficar procurando outros erros :wink: