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
obrigado, estou adaptando com base no seu!