जब मैं Latches और 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();