Ketika saya mempelajari tentang kait dan penghalang siklik, saya menemukan metafora ini.
cyclicbarriers : Bayangkan sebuah perusahaan memiliki ruang pertemuan. Untuk memulai pertemuan, sejumlah peserta rapat harus datang ke pertemuan (untuk menjadikannya resmi). berikut ini adalah kode peserta rapat biasa (seorang karyawan)
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!>");
}
}
}
karyawan bergabung dengan rapat, menunggu orang lain datang untuk memulai rapat. juga dia akan keluar jika pertemuan dibatalkan :) maka kita memiliki THE BOSS bagaimana dosis tidak suka menunggu orang lain muncul dan jika dia kehilangan pasiennya, dia membatalkan pertemuan.
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!!");
}
}
}
Pada hari normal, karyawan datang ke rapat menunggu yang lain muncul dan jika beberapa peserta tidak datang, mereka harus menunggu tanpa batas waktu! dalam beberapa pertemuan khusus, bos datang dan dia tidak suka menunggu. (5 orang perlu memulai rapat tetapi hanya bos yang datang dan juga karyawan yang antusias) sehingga dia membatalkan rapat (dengan marah)
CyclicBarrier meetingAtendeeQuorum = new CyclicBarrier(5);
Thread atendeeThread = new Thread(new MeetingAtendee(meetingAtendeeQuorum));
Thread atendeeThreadBoss = new Thread(new MeetingAtendeeTheBoss(meetingAtendeeQuorum));
atendeeThread.start();
atendeeThreadBoss.start();
Keluaran:
//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!>
Ada skenario lain di mana utas luar orang lain (gempa bumi) membatalkan pertemuan (metode reset panggilan). dalam hal ini semua utas menunggu dibangunkan oleh pengecualian.
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();
}
}
menjalankan kode akan menghasilkan keluaran lucu:
// 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!>
Anda juga dapat menambahkan sekretaris ke ruang rapat, jika rapat diadakan, dia akan mendokumentasikan semuanya tetapi dia bukan bagian dari rapat:
class MeetingSecretary implements Runnable {
@Override
public void run() {
System.out.println("preparing meeting documents");
System.out.println("taking notes ...");
}
}
Kait : jika bos yang marah ingin mengadakan pameran untuk pelanggan perusahaan, semua hal harus siap (sumber daya). kami memberikan daftar tugas yang harus dilakukan setiap pekerja (Utas) dosis pekerjaannya dan kami memeriksa daftar yang harus dilakukan (beberapa pekerja melukis, yang lain menyiapkan sistem suara ...). ketika semua item dalam daftar yang harus dilakukan sudah lengkap (sumber daya disediakan) kami dapat membuka pintu bagi pelanggan.
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");
}
}
Dan para pekerja bagaimana mempersiapkan pameran:
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();