1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Sincronização de Thread em Java (sincronizar coleções)

tenho definido uma Thread em Java na qual pretendo simular aviões chegando e partindo do aeroporto,

a classe aviao contém apenas numero e 10 passageiros

public class Aviao  {
    //numero de Aviao
    private int numeroAviao;
    //contém uma lista de passageiros
    private List<Passageiro> passageiros;

   public Aviao(int numero, int tamanho) {
            this.numeroAviao = numero;
            this.passageiros = new ArrayList<>(tamanho);
    }

    @Override
    public void adicionaPassageiro(Passageiro p) {
            this.passageiros.add(p);
    }
}

a classe aeroporto

 public class Aeroporto {
        private List<Passageiro> passageirosNoAeroporto;
        private List<Aviao> avioes;
        private Map<Aviao, ThreadAviao> threadAviao;
        private final Object mutex;
        private boolean comecou;
        private final Relogio relogio;

    public Aeroporto(int qtAviao) {
            this.mutex = new Object();
            this.comecou = false;
            this.passageirosNoAeroporto = new ArrayList<>();
            this.avioes = Collections.synchronizedList(new ArrayList<>());
            this.relogio = new Relogio();
            this.threadAviao = new HashMap<>();
            for (int j = 0; j < qtAviao; j++) {
                Aviao aviao = new Aviao(j + 1, 10);
                this.threadAviao.put(aviao, new ThreadAviao(this, aviao));
         }
    }

método adicionar avião no aeroporto e descarrega passageiros

public void AviaoChegou(Aviao aviao) {
        //adicionar aviao no aeroporto
        this.avioes.add(aviao);
        //usar uma lista sincronizada
        List <Aviao> lista = Collections.synchronizedList(avioes);
        synchronized (lista) {
            //iterar lista de avioes
            Iterator i = lista.iterator();
            while (i.hasNext()) {
                aviao = (Aviao) i.next();
                // iterar a lista de passageiros
                Iterator<Passageiro> it = aviao.getPassageiros().iterator();
                  while (it.hasNext()) {
                     Passageiro p = it.next();
                     //adicionar os pasageiros no aeroporto
                     passageirosNoAeroporto.add(p);
                     //remove os passageiros do aviao
                     it.remove();
                }
            }
        }
        //sai do método
    }

metodo para aviao partir quando estiver vazio

 public void AviaoPartiu(Aviao aviao) {
      //usar uma lista sincronizada
            List <Aviao> lista = Collections.synchronizedList(avioes);
            synchronized (lista) {
                Iterator i = lista.iterator();
                while (i.hasNext()) {
                    aviao = (Aviao) i.next();
                   i.remove();
                }
            }
        }

e por ultimo tenho a classe ThreadAviao

public class ThreadAviao extends Thread {

        private final Aviao aviao;
        private final Aeroporto aeroporto;

        public ThreadAviao(Aeroporto aeroporto, Aviao aviao) {
            this.aviao = aviao;
            this.aeroporto = aeroporto;
        }

        @Override
        public void run() {
            try {
                synchronized (mutex) {
                    while (!comecou) {
                        mutex.wait();
                    }
                }
                etapaAviao.executar(aeroporto, aviao);
            } catch (InterruptedException e) {
                // Não faz nada.
            }
        }
    }

a minha dúvida é que quando tenho 2 aviões criado em vez de cada um fazer o seu processo, ficam os dois a executar ao mesmo tempo, já tentei usar o List lista = Collections.synchronizedList(new ArrayList<>()); e mesmo assim, continua a não sincronizar, tal como mostra na figura

https://www.filepicker.io/api/file/POelTp4uSd6fbe4bcfoi

e o meu objetivo é tentar sincronizar a Thread para que possa atingir o objetivo tal como mostra na figura em baixo, e pode ser possível?

https://www.filepicker.io/api/file/Q20Xl82ZSMOSHdozILmn

Alguma sugestão ou orientação?

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java threads ou faça a sua própria pergunta.