Khi tôi đang nghiên cứu về Latches và cyclicbarrier, tôi đã nghĩ ra những ẩn dụ này.
cyclicbarrier : Hãy tưởng tượng một công ty có một phòng họp. Để bắt đầu cuộc họp, một số lượng người tham dự cuộc họp nhất định phải đến cuộc họp (để chính thức). Sau đây là mã của một người tham dự cuộc họp bình thường (một nhân viên)
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!>");
}
}
}
nhân viên tham gia cuộc họp, chờ người khác đến để bắt đầu cuộc họp. Ngoài ra, anh ta sẽ thoát nếu cuộc họp bị hủy bỏ :) sau đó chúng tôi có BOSS làm thế nào các liều không muốn chờ đợi người khác xuất hiện và nếu anh ta mất bệnh nhân của mình, anh ta hủy bỏ cuộc họp.
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!!");
}
}
}
Vào một ngày bình thường, nhân viên đến họp chờ người khác xuất hiện và nếu một số người tham dự không đến thì họ phải chờ vô thời hạn! trong một số cuộc họp đặc biệt, ông chủ đến và anh ta không muốn chờ đợi (5 người cần bắt đầu cuộc họp nhưng chỉ có sếp đến và cũng là một nhân viên nhiệt tình) nên anh ta hủy cuộc họp (giận dữ)
CyclicBarrier meetingAtendeeQuorum = new CyclicBarrier(5);
Thread atendeeThread = new Thread(new MeetingAtendee(meetingAtendeeQuorum));
Thread atendeeThreadBoss = new Thread(new MeetingAtendeeTheBoss(meetingAtendeeQuorum));
atendeeThread.start();
atendeeThreadBoss.start();
Đầu ra:
//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!>
Có một kịch bản khác trong đó một luồng ngoài khác (một trận động đất) hủy cuộc họp (phương thức đặt lại cuộc gọi). trong trường hợp này, tất cả các chuỗi chờ được đánh thức bởi một ngoại lệ.
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();
}
}
mã chạy sẽ dẫn đến đầu ra buồn cười:
// 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!>
Bạn cũng có thể thêm một thư ký vào phòng họp, nếu một cuộc họp được tổ chức, cô ấy sẽ ghi chép lại mọi thứ nhưng cô ấy không phải là một phần của cuộc họp:
class MeetingSecretary implements Runnable {
@Override
public void run() {
System.out.println("preparing meeting documents");
System.out.println("taking notes ...");
}
}
Chốt : nếu ông chủ tức giận muốn tổ chức triển lãm cho khách hàng của công ty, mọi thứ cần phải sẵn sàng (tài nguyên). chúng tôi cung cấp một danh sách việc cần làm mỗi công nhân (Chủ đề) làm công việc của mình và chúng tôi kiểm tra danh sách việc cần làm (một số công nhân vẽ tranh, những người khác chuẩn bị hệ thống âm thanh ...). khi tất cả các mục trong danh sách việc cần làm đã hoàn thành (tài nguyên được cung cấp), chúng tôi có thể mở cửa cho khách hàng.
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");
}
}
Và các công nhân đang chuẩn bị triển lãm như thế nào:
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();