เมื่อฉันเรียนเกี่ยวกับแลตช์และไซโคลบาเรียร์ฉันก็นึกถึงคำอุปมาอุปมัยนี้
cyclicbarriers : ลองนึกภาพ บริษัท ที่มีห้องประชุม เพื่อเริ่มการประชุมผู้เข้าร่วมประชุมจำนวนหนึ่งต้องมาประชุม (เพื่อให้เป็นทางการ) ต่อไปนี้เป็นรหัสของผู้เข้าร่วมประชุมปกติ (พนักงาน)
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!>");
}
}
}
พนักงานเข้าร่วมการประชุมรอให้ผู้อื่นมาเริ่มการประชุม นอกจากนี้เขายังได้รับการออกหากการประชุมถูกยกเลิก :) จากนั้นเรามีเจ้านายว่าขนาดไม่ต้องการรอให้คนอื่นมาปรากฏตัวและถ้าเขาสูญเสียผู้ป่วยของเขาเขายกเลิกการประชุม
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!!");
}
}
}
ในวันปกติพนักงานมาประชุมรอให้คนอื่นมาปรากฏตัวและหากผู้เข้าร่วมประชุมบางคนไม่มาพวกเขาต้องรออย่างไม่มีกำหนด! ในการประชุมพิเศษบางครั้งหัวหน้าจะมาและเขาไม่ชอบที่จะรอ (5 คนจำเป็นต้องเริ่มการประชุม แต่มีเพียงเจ้านายเท่านั้นที่มาพร้อมกับพนักงานที่กระตือรือร้น) ดังนั้นเขาจึงยกเลิกการประชุม (โกรธ)
CyclicBarrier meetingAtendeeQuorum = new CyclicBarrier(5);
Thread atendeeThread = new Thread(new MeetingAtendee(meetingAtendeeQuorum));
Thread atendeeThreadBoss = new Thread(new MeetingAtendeeTheBoss(meetingAtendeeQuorum));
atendeeThread.start();
atendeeThreadBoss.start();
เอาท์พุท:
//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!>
มีอีกสถานการณ์หนึ่งที่เธรดบุคคลภายนอกอื่น (แผ่นดินไหวโลก) ยกเลิกการประชุม (วิธีรีเซ็ตการโทร) ในกรณีนี้เธรดที่รอทั้งหมดจะถูกปลุกด้วยข้อยกเว้น
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();
}
}
รหัสที่ใช้งานจะส่งผลให้ออกตลก:
// 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!>
คุณยังสามารถเพิ่มเลขานุการในห้องประชุมได้หากมีการประชุมเธอจะทำเอกสารทุกอย่าง แต่เธอไม่ได้เป็นส่วนหนึ่งของการประชุม:
class MeetingSecretary implements Runnable {
@Override
public void run() {
System.out.println("preparing meeting documents");
System.out.println("taking notes ...");
}
}
Latches : หากหัวหน้าโกรธต้องการจัดนิทรรศการสำหรับลูกค้า บริษัท ทุกสิ่งต้องพร้อม (ทรัพยากร) เราจัดทำรายการสิ่งที่ต้องทำทุกคน (ด้าย) งานของเขาและเราตรวจสอบรายการสิ่งที่ต้องทำ เมื่อทุกรายการในรายการสิ่งที่ต้องทำเสร็จสมบูรณ์ (มีการจัดหาทรัพยากร) เราสามารถเปิดประตูให้ลูกค้า
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");
}
}
และคนงานกำลังเตรียมนิทรรศการอย่างไร:
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();