Dúvida com Thread

Pessoal, poderiam me tirar uma dúvida.
Qual o problema do meu código? A questão é bem simples, um algoritmo pra intercalar entre as threads, no caso a t1 e t2
pra ficar escrevendo Outono - verao - outono - verao e por aí vai.

segue o código abaixo:

public class Teste {
public static int set=1;

public static void main(String[] args) {
	
	
	new Thread(t1).start();
	new Thread(t2).start();


}

private static Runnable t1 = new Runnable() {
	public void run() {


		for (int i = 0; i < 3; i++) {
			while (set != 0) {
			}
			System.out.println("VERAO");
            set = 1;
		}
		
	}

};

private static Runnable t2 = new Runnable() {
	public void run() {

		for (int i = 0; i < 3; i++) {
			while (set != 1) {}
			System.out.println("OUTONO");
			set = 0;
		}
		
	}

};

}

Sempre que eu rodo, conforme o print, o programa raramente finaliza, fica pela metade, as vezes só mostra uma palavra… o que pode ser isso?

O problema é que as duas threads estão disputando o campo “set”. Você quer sincronizar as duas não é? Essa não é a melhor forma de fazer isso. Vou mexer no teu código… Já volto.

então, mas é q eu deixo esse while pra segurar a thread e só liberar o comando quando for a hora certa pra alternar entre elas… é uma questão da faculdade, aparentemente todos os alunos conseguem dessa forma menos eu, to começando a achar q é alguma coisa do meu pc, pq tá foda… vc poderia testar meu codigo no seu eclipse pra ver se ele empaca igual aqui ou flui normalmente?

Não é coisa do seu PC. Computação é determinística, não existe esse tipo de coisa psicológica que “lá funciona” e “aqui não funciona”.

Sinceramente, seu exemplo está bem enrolado, pq vc está fazendo tudo dentro de uma mesma classe, misturando as coisas. Vou te passar um exemplo clássico de produtor/consumidor, vc poderá adaptar para sua necessidade.

/**
 *
 * @author Prof. Dr. David Buzatto
 */
public class Deposito {
    
    private String mensagem;
    private boolean vazio = true;
    
    public synchronized String obter() {
        
        // aguarda até a mensagem estar disponível
        while ( vazio ) {
            try {
                wait();
            } catch ( InterruptedException exc ) {
                exc.printStackTrace();
            }
        }
        
        vazio = true;
        
        // notifica quem está esperando
        notifyAll();
        
        return mensagem;
        
    }
    
    public synchronized void inserir( String mensagem ) {
        
        // aguarda até a mensagem ser recuperada
        while ( !vazio ) {
            try {
                wait();
            } catch ( InterruptedException exc ) {
                exc.printStackTrace();
            }
        }
        
        vazio = false;
        this.mensagem = mensagem;
        
        // notifica quem está esperando
        notifyAll();
        
    }
    
}


import java.util.Random;

/**
 *
 * @author Prof. Dr. David Buzatto
 */
public class Produtor implements Runnable {
    
    private Deposito deposito;

    public Produtor( Deposito deposito ) {
        this.deposito = deposito;
    }
    
    @Override
    public void run() {
        
        String[] mensagens = { "um", "dois", "três", "quatro" };
        Random r = new Random();
        
        for ( int i = 0; i < mensagens.length; i++ ) {
            
            deposito.inserir( mensagens[i] );
            
            try {
                Thread.sleep( r.nextInt( 5000 ) );
            } catch ( InterruptedException exc ) {
                exc.printStackTrace();
            }
            
        }
        
        deposito.inserir( "pronto" );
        
    }
    
}



import java.util.Random;

/**
 *
 * @author Prof. Dr. David Buzatto
 */
public class Consumidor implements Runnable {
    
    private Deposito deposito;

    public Consumidor( Deposito deposito ) {
        this.deposito = deposito;
    }
    
    @Override
    public void run() {
        
        Random r = new Random();
        
        for ( String mensagem = deposito.obter();
                !mensagem.equals( "pronto" );
                 mensagem = deposito.obter() ) {
            
            System.out.printf( "mensagem recebida: %s\n", mensagem );
            
            try {
                Thread.sleep( r.nextInt( 5000 ));
            } catch ( InterruptedException exc ) {
                exc.printStackTrace();
            }
            
        }
        
    }
    
}

/**
 * Sincronização de execução entre duas threads usando wait e notifyAll
 * 
 * @author Prof. Dr. David Buzatto
 */
public class TesteProdutorConsumidor {
    
    public static void main( String[] args ) {
        
        Deposito deposito = new Deposito();
        new Thread( new Produtor( deposito ) ).start();
        new Thread( new Consumidor( deposito ) ).start();
        
    }
    
}

sim kkk, sei q não é, modo de falar, pq parece q só comigo q deu problema hahahah
obrigado desde já

Dá uma olhada Fábio, postei acima.
Seja bem-vindo ao GUJ :wink:

obrigado, estou adaptando com base no seu!