Usar cenário:
Vários encadeamentos esperam um pelo outro até que possam atender às condições antes de poderem executar operações subseqüentes. CyclicBarrier descreve a relação de espera entre cada encadeamento.
Siga as etapas:
- Instanciação normal: CyclicBarrier sCyclicBarrier = new CyclicBarrier (3);
- Com a instanciação de runnable, quando a barreira é quebrada, Runnable é executado primeiro: CyclicBarrier sCyclicBarrier = new CyclicBarrier (3, new Runnable () {// todo});
- aguardar: sCyclicBarrier.await ();
- Quando o número de threads de espera é o valor da contagem. Ative todos os threads em espera.
Princípio: explicado diretamente com o código fonte aqui (suplemento subsequente)
- O bloqueio é ReentrantLock bloqueio reentrante. ReentrantLock lock = new ReentrantLock ()
- Adquira a instância de condição do bloqueio. Condição trip = lock.newCondition ()
- aguarde thread, use Condition.await
- encadeamento de sinal, usando Condition.signalAll
- Dois construtores, inicializam o valor da parte, o valor da contagem e o Runnable (o runnable é executado primeiro ao acordar)
- O valor da contagem é usado para calcular o número de threads. Toda vez que um thread executa o método wait, --count. Até a contagem == 0
- aguardar método, incluindo tempo limite e tempo limite
- dowait é o principal código lógico da espera de threads. Quando count == 0, a operação de ativação é executada. Quando não for 0, insira o loop for e execute Condition.await.
- O loop for no dowait é para a lógica da operação de tempo limite.
- O salto normal para fora do loop for é através do método dowait (nextGeneration () re-instancia a gennaration)
- breakBarrier () quebra a barreira e ativa todos os threads de espera
- nextGeneration () atualiza o status e ativa todos os threads de espera
- reset () redefine o estado. Chama breakBarrier () e nextGeneration ()