ThreadPoolExecutor - 1

"সাধারণ প্রোগ্রামাররা খুব শীঘ্রই বা পরে এই সত্যটি বুঝতে পারে যে তাদের অনেক ছোট কাজ রয়েছে যা সময়ে সময়ে সম্পাদন করা প্রয়োজন।"

"আপনি যদি একটি গেম লিখছেন, তাহলে এটি এমন ক্রিয়া যা স্বতন্ত্র চরিত্রগুলি সম্পাদন করে।"

"যদি আপনি একটি ওয়েব সার্ভার লিখছেন, তাহলে এটি ব্যবহারকারীদের কাছ থেকে বিভিন্ন কমান্ড আসছে: একটি ফটো আপলোড করুন, এটি পছন্দসই বিন্যাসে ট্রান্সকোড করুন, পছন্দসই টেমপ্লেট প্রয়োগ করুন ইত্যাদি।"

"শীঘ্রই বা পরে, সমস্ত বড় কাজগুলি ছোট, পরিচালনাযোগ্য কাজের একটি সেটে বিভক্ত হয়ে যায়।"

"সুতরাং, এই প্রেক্ষাপটে, একটি সূক্ষ্ম প্রশ্ন জাগে: আপনি কীভাবে সেগুলি পরিচালনা করবেন বলে মনে করা হয়? যদি আপনাকে এক মিনিটে কয়েকশ কাজ সম্পাদন করতে হয়? প্রতিটি কাজের জন্য একটি থ্রেড তৈরি করা খুব বেশি অর্থবহ হবে না। জাভা মেশিন প্রতিটি থ্রেডের জন্য বেশ অনেক সম্পদ বরাদ্দ করে।"

"অন্য কথায়, একটি থ্রেড তৈরি এবং ধ্বংস করতে কাজটির চেয়ে বেশি সময় এবং সংস্থান নিতে পারে।"

"জাভার নির্মাতারা এই সমস্যার একটি মার্জিত সমাধান নিয়ে এসেছেন: ThreadPoolExecutor

" ThreadPoolExecutor হল একটি ক্লাস যার ভিতরে দুটি জিনিস রয়েছে:"

ক)  একটি টাস্ক কিউ, যা আপনি প্রোগ্রামে উঠার সাথে সাথে কাজ যোগ করতে পারেন।

খ) একটি থ্রেড পুল, যা থ্রেডের একটি গ্রুপ যা এই কাজগুলি সম্পাদন করে।

"আরও কি, একটি টাস্ক শেষ হয়ে গেলে থ্রেডগুলি ধ্বংস হয় না। পরিবর্তে, এটি প্রদর্শিত হওয়ার সাথে সাথে একটি নতুন কাজ শুরু করার জন্য প্রস্তুত হওয়ার জন্য তারা ঘুমিয়ে পড়ে।"

"আপনি যখন একটি ThreadPoolExecutor তৈরি করেন, তখন আপনি থ্রেড তৈরির সর্বোচ্চ সংখ্যা এবং সারিবদ্ধ কাজগুলির সর্বাধিক সংখ্যা সেট করতে পারেন। অন্য কথায়, আপনি থ্রেডের সংখ্যা 10-এ সীমাবদ্ধ করতে পারেন, উদাহরণস্বরূপ, এবং সারিবদ্ধ টাস্ক 100।"

" থ্রেডপুলএক্সিকিউটর এইভাবে কাজ করে:"

1)  আপনি যখন একটি নতুন টাস্ক যোগ করেন, এটি সারির শেষে রাখা হয়।

2)  সারি পূর্ণ হলে, একটি ব্যতিক্রম নিক্ষেপ করা হয়।

3)  একটি টাস্ক সম্পূর্ণ করার পরে, প্রতিটি থ্রেড সারি থেকে পরবর্তী কাজটি নেয় এবং এটি কার্যকর করা শুরু করে।

4) সারিতে কোন কাজ না থাকলে, নতুন কাজ যোগ না হওয়া পর্যন্ত একটি থ্রেড ঘুমাতে যায়।

"পন্থা, যেখানে আমরা কর্মী থ্রেডের সংখ্যা সীমিত করি, এটি সুবিধাজনক যে আমাদের যত বেশি থ্রেড আছে, তত বেশি তারা একে অপরের সাথে হস্তক্ষেপ করে। 5-10 কর্মী থ্রেড এবং কাজের একটি দীর্ঘ সারি থাকা অনেক বেশি কার্যকর। কাজের বৃদ্ধির জন্য 100টি থ্রেড তৈরি করতে, যা সম্পদগুলির জন্য একে অপরের সাথে প্রতিযোগিতা করবে: মেমরি, প্রসেসর সময়, ডাটাবেস অ্যাক্সেস ইত্যাদি।"

"এখানে ThreadPoolExecutor কর্মে একটি উদাহরণ:"

উদাহরণ
ExecutorService service = Executors.newFixedThreadPool(2);

for(int i = 0; i < 10; i++)
{
 service.submit(new Runnable() {
    public void run()
    {
     // Here we download something big from the Internet.
    }
 });
}

"ওহ, আমি এটা দেখতে পাচ্ছি না ..."

"একটি ThreadPoolExecutor অবজেক্ট তৈরি করা হয় যখন নতুন ফিক্সড থ্রেডপুল পদ্ধতি কল করা হয়।"

সুতরাং, এটি ব্যবহার করা খুব সহজ। আপনি জমা দেওয়ার পদ্ধতির সাথে এটিতে একটি টাস্ক যুক্ত করার সাথে সাথে এটি:

ক)  একটি ঘুমন্ত থ্রেড জাগিয়ে তোলে, যদি একটি থাকে, টাস্কটি কার্যকর করার জন্য।

খ)  যদি কোনও অপেক্ষার থ্রেড না থাকে, তাহলে এটি কাজের জন্য একটি নতুন তৈরি করে।

গ)  যদি সর্বাধিক সংখ্যক থ্রেডে পৌঁছে যায়, তাহলে এটি কেবল সারির শেষে টাস্কটি রাখে।

"আমি ইচ্ছাকৃতভাবে উদাহরণে «এখানে আমরা ইন্টারনেট থেকে বড় কিছু ডাউনলোড করি» অন্তর্ভুক্ত করেছি। যদি আমাদের 100টি কাজ থাকে «ইন্টারনেট থেকে বড় কিছু ডাউনলোড করুন», তাহলে একই সময়ে অনেকগুলি চালানোর কোনো মানে হয় না—আমরা' আমাদের ইন্টারনেট সংযোগের ব্যান্ডউইথ সীমা দ্বারা আটকে রাখা হবে। এই ক্ষেত্রে, কয়েকটি থ্রেড যথেষ্ট হওয়া উচিত। উপরের উদাহরণে আপনি এটি দেখতে পাচ্ছেন:"

ExecutorService service = Executors.newFixedThreadPool(2);

"এটি দেখা যাচ্ছে যে একগুচ্ছ কাজের সাথে কাজ করা এত কঠিন নয়।"

"হ্যাঁ। আপনি কল্পনা করতে পারেন তার চেয়েও সহজ। কিন্তু কিম আপনাকে সে সম্পর্কে বলবে।"