9 Nisan 2018 Pazartesi

CyclicBarrier Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.concurrent.CyclicBarrier;
Bu sınıf tüm thread'lerin aynı noktada buluşmasını sağlar. Detaylı bir kullanım örneği için buraya bakınız.
Java diğer thred'leri beklemek için 3 tane sınıf sunuyor Bunlar CyclicBarrier, CountDownLatch, ve Phaser.

CountdownLatch İle Farkı
Bu sınıf ve CountdownLatch çok benziyorlar. Aralarında bazı farklar var. CyclicBarrier daha karmaşık işler için kullanılır. Açıklaması şöyle.
Use CyclicBarrier when you do the work and need to wait in the same threads. When you need to wait for tasks done in other threads, use CountDownLatch instead. To use CyclicBarrier or CountDownLatch, you need to know the number of threads when you call the constructor. If you need to add threads after construction time, use the class Phaser.
1. CyclicBarrier sayma işlemi bitince çalıştırmak üzere bir Runnable alabilir.
2. Barrier reset'lenip tekrar kullanılabilir.
3. CyclicBarrier nesnesinin await() metodu farklı thread'ler tarafından çağrılmalıdır. CountdownLatch için countDown() metodu aynı thread tarafından arka arkaya çağrılsa bile sorun olmaz.

Phaser İle Farkı
Açıklaması şöyle.
If you need to add threads after construction time, use the class Phaser.
Kullanım
Tek önemli metod var. Bu da await() : Sayacın 0 olmasını bekler

constructor
Şöyle yaparız.
CyclicBarrier barrier = new CyclicBarrier(3); 
await
Açıklaması şöyle
The int await() method causes the current thread to wait until one of the events occurs:
- the last thread arrives at the barrier
- the barrier is broken (by the reasons described below)

If the barrier is broken, then depending on the reason InterruptedException, BrokenBarrierException are thrown.
Thread içinde çağrılır. Diğer thread'lerin de aynı satıra gelmesini bekler. Nesnenin isminin cyclic olmasından anlaşılacağı gibi son thread de await'i çağırıp sayaç 0 olduktan sonra otomatik olarak tekrar 3 değerini alır.
barrier.await(); //Barrier automatically resets.
Örnek
Şöyle yaparız
private static final int PARTIES = 3;
private static final int ITERATIONS = 3;
public static void main(String[] args) throws BrokenBarrierException,InterruptedException {
  CyclicBarrier entryBarrier = new CyclicBarrier(PARTIES + 1, () ->
logger.info("iteration started"));
  CyclicBarrier exitBarrier = new CyclicBarrier(PARTIES + 1, () ->
logger.info("iteration finished"));
  for (int i = 0; i < ITERATIONS; i++) {
    for (int p = 0; p < PARTIES; p++) {
      int delay = p + 1;
      Runnable task = new Worker(delay, entryBarrier, exitBarrier);
      new Thread(task).start();
    }
    logger.info("all threads waiting to start: iteration {}", i);
    sleep(1);
    entryBarrier.await();
    logger.info("all threads started: iteration {}", i);
    exitBarrier.await();
    logger.info("all threads finished: iteration {}", i);
  }
}
Thread sınıfını şöyle yaparız
private static class Worker implements Runnable {
  private final int delay;
  private final CyclicBarrier entryBarrier;
  private final CyclicBarrier exitBarrier;
  Worker(int delay, CyclicBarrier entryBarrier, CyclicBarrier exitBarrier) {
    this.delay = delay;
    this.entryBarrier = entryBarrier;
    this.exitBarrier = exitBarrier;
  }
  @Override
  public void run() {
    try {
      entryBarrier.await();
      work();
      exitBarrier.await();
    } catch (InterruptedException | BrokenBarrierException e) {
      throw new RuntimeException(e);
    }
  }
  private void work() {
    logger.info("work {} started", delay);
    sleep(delay);
    logger.info("work {} finished", delay);
  }
}
await - Timeout
Açıklaması şöyle
The int await(long timeout, TimeUnit unit) method causes the current thread to wait until one of the events occurs:
- the given timeout elapses
- the last thread arrives at the barrier
- the barrier is broken (by the reasons described below)

If the specified timeout elapses, then a TimeoutException is thrown. If the barrier is broken, then depending on the reason InterruptedException, BrokenBarrierException are thrown.

The await method returns the arrival index of the current thread.
isBroken metodu
Açıklaması şöyle
The boolean isBroken() method returns true if this barrier has been broken by one of the reasons:
- interruption
- timeout elapsing
- calling the reset() method
- the barrier action failure due to an exception
getNumberWaiting metodu
Açıklaması şöyle
The int getNumberWaiting() method returns the number of parties currently waiting at the barrier.
getParties metodu
Açıklaması şöyle
The int getParties() method returns the number of parties required to trip the barrier.
reset metodu
Açıklaması şöyle
The void reset() method resets the barrier to its initial state. If any threads are waiting at the barrier on the await methods, the methods will throw a BrokenBarrierException.

Hiç yorum yok:

Yorum Gönder