গৃহীত উত্তর হিসাবে চিহ্নিত কোনও উত্তর না থাকায় আমি লাইভ লক উদাহরণ তৈরি করার চেষ্টা করেছি;
মূল প্রোগ্রামটি আমার দ্বারা লিখেছিল এপ্রিল ২০১২ এ মাল্টিথ্রেডিংয়ের বিভিন্ন ধারণাটি শিখতে। এবার আমি এটিকে সংশোধন করে অচলাবস্থা, রেসের শর্ত, লাইভলক ইত্যাদি তৈরি করেছি
সুতরাং আসুন প্রথমে সমস্যার বিবৃতিটি বুঝতে পারি;
কুকি প্রস্তুতকারকের সমস্যা
কিছু উপাদান পাত্রে রয়েছে: চকোপাউডারকন্টেইনার , হুইটপাউডারকন্টেইনার । কুকি মেকার একটি কুকি বেক করতে উপাদান পাত্রে কিছু পরিমাণে গুঁড়া নেয় । যদি কোনও কুকি প্রস্তুতকারী কোনও কন্টেইনার খালি পেয়ে যায় তবে সময় সাশ্রয়ের জন্য এটি অন্য পাত্রে পরীক্ষা করে। এবং ফিলার প্রয়োজনীয় ধারকটি পূরণ না করা পর্যন্ত অপেক্ষা করে। একজন ফিলার আছেন যিনি নিয়মিত বিরতিতে ধারকটি পরীক্ষা করেন এবং কোনও ধারক প্রয়োজন হলে কিছু পরিমাণ পূরণ করে।
গিথুব এ সম্পূর্ণ কোড পরীক্ষা করুন ;
আমি আপনাকে সংক্ষেপে বাস্তবায়ন ব্যাখ্যা করতে দিন।
- আমি ডিমন থ্রেড হিসাবে ফিলার শুরু করি । সুতরাং এটি নিয়মিত বিরতিতে পাত্রগুলি পূরণ করতে থাকবে। প্রথমে একটি ধারক পূরণ করার জন্য এটি ধারকটি লক করে -> এটির জন্য কোনও গুঁড়ো দরকার কিনা তা পরীক্ষা করে দেখুন -> এটি পূরণ করে -> সমস্ত নির্মাতারা যারা এর জন্য অপেক্ষা করছেন -> কনটেইনারটি আনলক করুন signal
- আমি কুকি মেকার তৈরি করেছি এবং সেট করেছি যে এটি সমান্তরালে 8 টি কুকি বেক করতে পারে। এবং কুকিজ বেক করতে আমি 8 টি থ্রেড শুরু করি।
- প্রতিটি প্রস্তুতকারকের থ্রেড পাত্রে পাউডার নিতে 2 টি কলযোগ্য সাব-থ্রেড তৈরি করে।
- সাব-থ্রেডটি একটি ধারকটিতে একটি লক নেয় এবং এটিতে পর্যাপ্ত পরিমাণে গুঁড়ো রয়েছে কিনা তা পরীক্ষা করে দেখুন। যদি না হয়, কিছু সময়ের জন্য অপেক্ষা করুন। ফিলার একবার পাত্রটি পূরণ করে, এটি পাউডার নেয় এবং ধারকটি আনলক করে।
- এখন এটি অন্যান্য ক্রিয়াকলাপ যেমন: মিশ্রণ তৈরি এবং বেকিং ইত্যাদি সম্পূর্ণ করে
কোডটি একবার দেখে নেওয়া যাক:
CookieMaker.java
private Integer getMaterial(final Ingredient ingredient) throws Exception{
:
container.lock();
while (!container.getIngredient(quantity)) {
container.empty.await(1000, TimeUnit.MILLISECONDS);
//Thread.sleep(500); //For deadlock
}
container.unlock();
:
}
IngredientContainer.java
public boolean getIngredient(int n) throws Exception {
:
lock();
if (quantityHeld >= n) {
TimeUnit.SECONDS.sleep(2);
quantityHeld -= n;
unlock();
return true;
}
unlock();
return false;
}
ফিলার পাত্রে পূর্ণ না হওয়া পর্যন্ত সবকিছু ঠিক থাকে । তবে আমি যদি ফিলারটি শুরু করতে ভুলে যাই, বা ফিলারটি অপ্রত্যাশিত ছুটিতে চলে যায় তবে সাব-থ্রেডগুলি অন্য নির্মাতাকে যেতে এবং ধারকটি পরীক্ষা করতে দেওয়ার জন্য তাদের রাজ্যগুলি পরিবর্তন করে রাখে।
আমি একটি ডেমন থ্রেডট্রেসারও তৈরি করেছি যা থ্রেডের রাজ্য এবং ডেডলকগুলিতে নজর রাখে। এটি কনসোল থেকে আউটপুট;
2016-09-12 21:31:45.065 :: [Maker_0:WAITING, Maker_1:WAITING, Maker_2:WAITING, Maker_3:WAITING, Maker_4:WAITING, Maker_5:WAITING, Maker_6:WAITING, Maker_7:WAITING, pool-7-thread-1:TIMED_WAITING, pool-7-thread-2:TIMED_WAITING, pool-8-thread-1:TIMED_WAITING, pool-8-thread-2:TIMED_WAITING, pool-6-thread-1:TIMED_WAITING, pool-6-thread-2:TIMED_WAITING, pool-5-thread-1:TIMED_WAITING, pool-5-thread-2:TIMED_WAITING, pool-1-thread-1:TIMED_WAITING, pool-3-thread-1:TIMED_WAITING, pool-2-thread-1:TIMED_WAITING, pool-1-thread-2:TIMED_WAITING, pool-4-thread-1:TIMED_WAITING, pool-4-thread-2:RUNNABLE, pool-3-thread-2:TIMED_WAITING, pool-2-thread-2:TIMED_WAITING]
2016-09-12 21:31:45.065 :: [Maker_0:WAITING, Maker_1:WAITING, Maker_2:WAITING, Maker_3:WAITING, Maker_4:WAITING, Maker_5:WAITING, Maker_6:WAITING, Maker_7:WAITING, pool-7-thread-1:TIMED_WAITING, pool-7-thread-2:TIMED_WAITING, pool-8-thread-1:TIMED_WAITING, pool-8-thread-2:TIMED_WAITING, pool-6-thread-1:TIMED_WAITING, pool-6-thread-2:TIMED_WAITING, pool-5-thread-1:TIMED_WAITING, pool-5-thread-2:TIMED_WAITING, pool-1-thread-1:TIMED_WAITING, pool-3-thread-1:TIMED_WAITING, pool-2-thread-1:TIMED_WAITING, pool-1-thread-2:TIMED_WAITING, pool-4-thread-1:TIMED_WAITING, pool-4-thread-2:TIMED_WAITING, pool-3-thread-2:TIMED_WAITING, pool-2-thread-2:TIMED_WAITING]
WheatPowder Container has 0 only.
2016-09-12 21:31:45.082 :: [Maker_0:WAITING, Maker_1:WAITING, Maker_2:WAITING, Maker_3:WAITING, Maker_4:WAITING, Maker_5:WAITING, Maker_6:WAITING, Maker_7:WAITING, pool-7-thread-1:TIMED_WAITING, pool-7-thread-2:TIMED_WAITING, pool-8-thread-1:TIMED_WAITING, pool-8-thread-2:TIMED_WAITING, pool-6-thread-1:TIMED_WAITING, pool-6-thread-2:TIMED_WAITING, pool-5-thread-1:TIMED_WAITING, pool-5-thread-2:TIMED_WAITING, pool-1-thread-1:TIMED_WAITING, pool-3-thread-1:TIMED_WAITING, pool-2-thread-1:TIMED_WAITING, pool-1-thread-2:TIMED_WAITING, pool-4-thread-1:TIMED_WAITING, pool-4-thread-2:TIMED_WAITING, pool-3-thread-2:TIMED_WAITING, pool-2-thread-2:RUNNABLE]
2016-09-12 21:31:45.082 :: [Maker_0:WAITING, Maker_1:WAITING, Maker_2:WAITING, Maker_3:WAITING, Maker_4:WAITING, Maker_5:WAITING, Maker_6:WAITING, Maker_7:WAITING, pool-7-thread-1:TIMED_WAITING, pool-7-thread-2:TIMED_WAITING, pool-8-thread-1:TIMED_WAITING, pool-8-thread-2:TIMED_WAITING, pool-6-thread-1:TIMED_WAITING, pool-6-thread-2:TIMED_WAITING, pool-5-thread-1:TIMED_WAITING, pool-5-thread-2:TIMED_WAITING, pool-1-thread-1:TIMED_WAITING, pool-3-thread-1:TIMED_WAITING, pool-2-thread-1:TIMED_WAITING, pool-1-thread-2:TIMED_WAITING, pool-4-thread-1:TIMED_WAITING, pool-4-thread-2:TIMED_WAITING, pool-3-thread-2:TIMED_WAITING, pool-2-thread-2:TIMED_WAITING]
আপনি সাব-থ্রেডগুলি দেখতে পাবেন এবং তাদের রাজ্য পরিবর্তন করে অপেক্ষা করছেন।