আমি যখন লাচস এবং সাইক্লিকবারিয়ারগুলি নিয়ে অধ্যয়ন করছিলাম তখন আমি এই রূপকগুলি নিয়ে এসেছি।
চক্রবৃদ্ধি : কল্পনা করুন যে কোনও সংস্থার একটি সভা ঘর আছে meeting সভাটি শুরু করতে, নির্দিষ্ট সংখ্যক বৈঠকে উপস্থিত থাকতে হবে (এটিকে অফিসিয়াল করার জন্য) make নিম্নলিখিত একটি সাধারণ সভা অংশগ্রহণকারী (একটি কর্মচারী) এর কোড
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 ...");
}
}
লেচস : রাগী বস যদি কোম্পানির গ্রাহকদের জন্য একটি প্রদর্শনী রাখতে চান তবে প্রতিটি জিনিস প্রস্তুত (সংস্থান) করা দরকার। আমরা প্রতিটি কর্মী (থ্রেড) তার কাজ ডোজ প্রদান করি এবং আমরা করণীয় তালিকাটি পরীক্ষা করি (কিছু শ্রমিক পেইন্টিং করেন, অন্যরা সাউন্ড সিস্টেম প্রস্তুত করেন ...)। করণীয় তালিকার সমস্ত আইটেম সম্পূর্ণ হয়ে গেলে (সংস্থানগুলি সরবরাহ করা হয়) আমরা গ্রাহকদের জন্য দরজা খুলতে পারি।
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();