Sürgüler ve siklik bariyerler üzerinde çalışırken bu metaforları buldum.
döngüsel engeller : Bir şirketin bir toplantı odası olduğunu hayal edin. Toplantıya başlamak için belirli sayıda toplantı katılımcısı toplantıya gelmelidir (resmi hale getirmek için). aşağıda normal bir toplantı katılımcının kodu (çalışan)
class MeetingAtendee implements Runnable {
CyclicBarrier myMeetingQuorumBarrier;
public MeetingAtendee(CyclicBarrier myMileStoneBarrier) {
this.myMeetingQuorumBarrier = myMileStoneBarrier;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " i joined the meeting ...");
myMeetingQuorumBarrier.await();
System.out.println(Thread.currentThread().getName()+" finally meeting stared ...");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
System.out.println("Meeting canceled! every body dance <by chic band!>");
}
}
}
çalışan toplantıya katılır, başkalarının toplantıya başlamasını bekler. ayrıca toplantı iptal edilirse çıkılır :) o zaman BOSS'un dozları başkalarının görünmesini beklemek istemez ve hastasını kaybederse toplantıyı iptal eder.
class MeetingAtendeeTheBoss implements Runnable {
CyclicBarrier myMeetingQuorumBarrier;
public MeetingAtendeeTheBoss(CyclicBarrier myMileStoneBarrier) {
this.myMeetingQuorumBarrier = myMileStoneBarrier;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "I am THE BOSS - i joined the meeting ...");
//boss dose not like to wait too much!! he/she waits for 2 seconds and we END the meeting
myMeetingQuorumBarrier.await(1,TimeUnit.SECONDS);
System.out.println(Thread.currentThread().getName()+" finally meeting stared ...");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
System.out.println("what WHO canceled The meeting");
} catch (TimeoutException e) {
System.out.println("These employees waste my time!!");
}
}
}
Normal bir günde, çalışanlar toplantıya gelip diğerlerinin görünmesini beklerler ve bazı katılımcılar gelmezse süresiz olarak beklemek zorunda kalırlar! bazı özel toplantılarda patron gelir ve beklemekten hoşlanmaz.
CyclicBarrier meetingAtendeeQuorum = new CyclicBarrier(5);
Thread atendeeThread = new Thread(new MeetingAtendee(meetingAtendeeQuorum));
Thread atendeeThreadBoss = new Thread(new MeetingAtendeeTheBoss(meetingAtendeeQuorum));
atendeeThread.start();
atendeeThreadBoss.start();
Çıktı:
//Thread-1I am THE BOSS - i joined the meeting ...
// Thread-0 i joined the meeting ...
// These employees waste my time!!
// Meeting canceled! every body dance <by chic band!>
Başka bir yabancı iş parçacığının (bir deprem) toplantıyı iptal ettiği başka bir senaryo daha vardır (çağrı sıfırlama yöntemi). bu durumda tüm bekleyen evreler bir istisna ile uyandırılır.
class NaturalDisasters implements Runnable {
CyclicBarrier someStupidMeetingAtendeeQuorum;
public NaturalDisasters(CyclicBarrier someStupidMeetingAtendeeQuorum) {
this.someStupidMeetingAtendeeQuorum = someStupidMeetingAtendeeQuorum;
}
void earthQuakeHappening(){
System.out.println("earth quaking.....");
someStupidMeetingAtendeeQuorum.reset();
}
@Override
public void run() {
earthQuakeHappening();
}
}
çalışan kod komik çıktı ile sonuçlanacaktır:
// Thread-1I am THE BOSS - i joined the meeting ...
// Thread-0 i joined the meeting ...
// earth quaking.....
// what WHO canceled The meeting
// Meeting canceled! every body dance <by chic band!>
Ayrıca toplantı odasına bir sekreter de ekleyebilirsiniz, eğer bir toplantı yapılırsa her şeyi belgeleyecektir, ancak toplantının bir parçası değildir:
class MeetingSecretary implements Runnable {
@Override
public void run() {
System.out.println("preparing meeting documents");
System.out.println("taking notes ...");
}
}
Mandallar : Öfkeli patron şirket müşterileri için bir sergi düzenlemek istiyorsa, her şeyin hazır olması gerekir (kaynaklar). her işçiye (İş Parçacığı) işini dozlayan bir yapılacaklar listesi sağlıyoruz ve yapılacaklar listesini kontrol ediyoruz (bazı çalışanlar resim yapıyor, diğerleri ses sistemi hazırlıyor ...). yapılacaklar listesindeki tüm öğeler tamamlandığında (kaynaklar sağlanır) müşterilere kapıları açabiliriz.
public class Visitor implements Runnable{
CountDownLatch exhibitonDoorlatch = null;
public Visitor (CountDownLatch latch) {
exhibitonDoorlatch = latch;
}
public void run() {
try {
exhibitonDoorlatch .await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("customer visiting exebition");
}
}
Ve işçiler sergiyi nasıl hazırlıyorlar:
class Worker implements Runnable {
CountDownLatch myTodoItem = null;
public Worker(CountDownLatch latch) {
this.myTodoItem = latch;
}
public void run() {
System.out.println("doing my part of job ...");
System.out.println("My work is done! remove it from todo list");
myTodoItem.countDown();
}
}
CountDownLatch preperationTodoList = new CountDownLatch(3);
// exhibition preparation workers
Worker electricalWorker = new Worker(preperationTodoList);
Worker paintingWorker = new Worker(preperationTodoList);
// Exhibition Visitors
ExhibitionVisitor exhibitionVisitorA = new ExhibitionVisitor(preperationTodoList);
ExhibitionVisitor exhibitionVisitorB = new ExhibitionVisitor(preperationTodoList);
ExhibitionVisitor exhibitionVisitorC = new ExhibitionVisitor(preperationTodoList);
new Thread(electricalWorker).start();
new Thread(paintingWorker).start();
new Thread(exhibitionVisitorA).start();
new Thread(exhibitionVisitorB).start();
new Thread(exhibitionVisitorC).start();