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 — ).
Açıklaması şöyle. Tüm thread'lerin varmasını bekler
ÖrnekThe int arriveAndAwaitAdvance() marks a party arriving at the phaser and awaits other parties to arrive (arrived++, unarrived — ).
main'de şöyle yaparız. Phaser constructor'a 1 veriyoruz çünkü main thread'i de register() etmek istiyoruz
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.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());
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}@Overridepublic void run() {ph.arriveAndAwaitAdvance(); //Wait all parties to arrivetry {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