Thread: Veja exemplo de uso: balcão de passagens aéreas

 
 

import java.util.Map;

import java.util.HashMap;

 
 

public class Balcao implements Runnable{

private Aviao aviao = new Aviao();

 
 

public static void main(String[] args){

Balcao b = new Balcao();

Thread t1 = new Thread(b, “Pedro”);

Thread t2 = new Thread(b, “Juliane”);

t1.start();

t2.start();

}

 
 

 
 

public boolean reservarLugar(Integer lugar){

String nome = Thread.currentThread().getName();

if (aviao.isOcupado(lugar)){

System.out.println(nome + “: seu lugar ” + lugar + ” não pode ser reservado”);

return false;

}

aviao.ocuparLugar(lugar);

System.out.println(nome + “: lugar ” + lugar + ” reservado”);

return true;

}

 
 

@Override

public void run() {

for (int i = 0; i < 5; i++){

try {

Thread.currentThread().sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

this.reservarLugar(i);

}

}

 
 

}

 
 

class Aviao {

private Map<Integer, Boolean> lugares = new HashMap<Integer, Boolean>();

 
 

public Aviao(){

for (int i = 0; i < 5; i++){

lugares.put(i, false);

}

}

public boolean isOcupado(Integer lugar){

return lugares.get(lugar);

}

 
 

public void ocuparLugar(Integer lugar){

lugares.put(lugar, true);

}

}

 
 

Possivel output:

Pedro: lugar 0 reservado

Juliane: lugar 0 reservado

 
 

Juliane: lugar 1 reservado

Pedro: lugar 1 reservado

 
 

Pedro: lugar 2 reservado

Juliane: lugar 2 reservado

 
 

Juliane: lugar 3 reservado

Pedro: lugar 3 reservado

 
 

Pedro: lugar 4 reservado

Juliane: lugar 4 reservado

 
 

Veja como podemos ter conflitos de reserva no resultado apresentado acima. Para corrigir este problema adicionamos a keyword “synchronized” no método reservarLugar. Portanto, apenas uma Thread poderá acessá-lo de cada vez:

 
 

 
 

public synchronized boolean reservarLugar(Integer lugar){

String nome = Thread.currentThread().getName();

if (aviao.isOcupado(lugar)){

System.out.println(nome + “: seu lugar ” + lugar + ” não pode ser reservado”);

return false;

}

aviao.ocuparLugar(lugar);

System.out.println(nome + “: lugar ” + lugar + ” reservado”);

return true;

}

 
 

 
 

 
 

Possível output:

Juliane: lugar 0 reservado

Pedro: seu lugar 0 não pode ser reservado

 
 

Juliane: lugar 1 reservado

Pedro: seu lugar 1 não pode ser reservado

 
 

Pedro: lugar 2 reservado

Juliane: seu lugar 2 não pode ser reservado

 
 

Juliane: lugar 3 reservado

Pedro: seu lugar 3 não pode ser reservado

 
 

Pedro: lugar 4 reservado

Juliane: seu lugar 4 não pode ser reservado

 
 

Anúncios
Esta entrada foi publicada em Threads com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s