6 Ocak 2021 Çarşamba

Phaser Sınıfı

Giriş
Şu satırı dahil ederiz
import java.util.concurrent.Phaser;
Açıklaması şöyle. Phaser'ın CountDownLatch sınıfına göre farkı, kaç tane thread'ın buluşacağını constructor'da vermek yerine dinamik olarak ta verebilmemiz.
Phaser is also a flexible barrier that blocks multiple threads for execution. It executes a number of threads dynamically in separate phases. It is a better flexible approach when compared to the CyclicBarrier and CountDownLatch.
Açıklaması şöyle
The current phase is finished when all registered parties arrive (registered==arrived, unarrived==0). 
constuctor - int parties
Açıklaması şöyle
The Phaser(int parties) constructor creates a phaser with initial phase number 0 and the given number of registered parties (phase=0, registered=parties).
arrive metodu
Açıklaması şöyle
The int arrive() method marks a party arriving at the phaser, without waiting for other parties to arrive (arrived++, unarrived — ).
arriveAndAwaitAdvance metodu
Açıklaması şöyle. Tüm thread'lerin varmasını bekler
The int arriveAndAwaitAdvance() marks a party arriving at the phaser and awaits other parties to arrive (arrived++, unarrived — ).
Örnek
main'de şöyle yaparız. Phaser constructor'a 1 veriyoruz çünkü main thread'i de register() etmek istiyoruz
ExecutorService executorService = Executors.newCachedThreadPool();
Phaser ph = new Phaser(1);
assertEquals(0, ph.getPhase());

executorService.submit(new LongRunningAction("thread-1", ph));
executorService.submit(new LongRunningAction("thread-2", ph));
executorService.submit(new LongRunningAction("thread-3", ph));

ph.arriveAndAwaitAdvance();
 
assertEquals(1, ph.getPhase());
Thread'lerde şöyle yaparız. constructor içinde register() çağrısı ile Phaser sayacı artırılır. Daha sonra run() içinde arriveAndAwaitAdvance() içinde tüm register() olan thread'lerin aynı noktaya gelmesi beklenir.
class LongRunningAction implements Runnable {
  private String threadName;
  private Phaser ph;

  LongRunningAction(String threadName, Phaser ph) {
    this.threadName = threadName;
    this.ph = ph;
    ph.register(); //Thread registers to phaser
  }

  @Override
  public void run() {
    ph.arriveAndAwaitAdvance(); //Wait all parties to arrive
    try {
      Thread.sleep(20);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    ph.arriveAndDeregister(); //Thread deregisters from phaser
  }
}
arriveAndDerigster metodu
Örnek yukarıda

register metodu
Örnek yukarıda

Hiç yorum yok:

Yorum Gönder