কোনও হ্যান্ডলার ব্যবহার করার সুবিধা এবং কারণগুলি কী এবং কোনও থ্রেড নয়?
একটি হ্যান্ডলার আপনাকে Runnableকোনও থ্রেডের সাথে সম্পর্কিত বার্তা এবং অবজেক্টগুলি প্রেরণ এবং প্রক্রিয়া করার অনুমতি দেয় MessageQueue। প্রতিটি Handlerউদাহরণ একক থ্রেড এবং সেই থ্রেডের বার্তার সারিটির সাথে সম্পর্কিত।
আপনি যখন একটি নতুন তৈরি করেন Handler, এটি যে থ্রেডটি তৈরি করছে তার থ্রেড / বার্তা সারিতে আবদ্ধ - সেদিক থেকে এটি বার্তাগুলি এবং রানবেলগুলি সেই বার্তার কাতারে পৌঁছে দেবে এবং বার্তা সারি থেকে বেরিয়ে আসার সাথে সাথে তাদের সম্পাদন করবে ।
হ্যান্ডলারের জন্য দুটি প্রধান ব্যবহার রয়েছে:
- ভবিষ্যতে কিছু বিষয় হিসাবে বার্তাগুলি এবং রান্নেবলগুলি নির্বাহ করা হবে schedule
- করার সারিবদ্ধ একটি কর্ম আপনার নিজের চেয়ে ভিন্ন থ্রেডে সম্পাদন করা যায়।
আপনি যদি জাভা থ্রেড ব্যবহার করেন তবে আপনাকে নিজের থেকে কিছু কিছু পরিচালনা করতে হবে - মূল থ্রেডের সাথে সিঙ্ক্রোনাইজ করা, কোনও থ্রেড বাতিল করা ইত্যাদি
এই একক থ্রেডটি থ্রেড পুল তৈরি করে না আপনি যদি না ব্যবহার করেন ThreadPoolExecutorবা ExecutorServiceএপিআই না করেন।
(ব্ল্যাকবেল্ট উত্তরের উপর আপনার মন্তব্যগুলি থেকে এই প্রশ্নটি নেওয়া)
এক্সিকিউটর ব্যবহার করবেন না কেন? এবং এমনকি যদি আমি হ্যান্ডলারটি এটি করতে ব্যবহার করতে চাইতাম তবে কীভাবে?
তথ্যসূত্র: থ্রেড পারফরম্যান্স নিবন্ধ
কিছু নির্দিষ্ট ধরণের কাজ রয়েছে যা অত্যন্ত সমান্তরাল, বিতরণকৃত কার্যগুলিতে হ্রাস করা যেতে পারে। কাজের প্যাকেটের নিখুঁত ভলিউম সহ এটি তৈরি হয় AsyncTaskএবং HandlerThreadউপযুক্ত ক্লাস হয় না। এর একক AsyncTaskথ্রেডযুক্ত প্রকৃতি সমস্ত থ্রেডপুল করা কাজকে একটি রৈখিক সিস্টেমে রূপান্তরিত করে। অন্যদিকে HandlerThreadক্লাসটি ব্যবহার করে প্রোগ্রামারকে ম্যানুয়ালি থ্রেডের একটি গ্রুপের মধ্যে লোড ভারসাম্য পরিচালনা করতে হবে।
এই প্রক্রিয়াটিকে আরও সহজ করার জন্য থ্রেডপুলএ্যাক্সিকিউটর হেল্পার ক্লাস। এই শ্রেণিটি একটি থ্রেডের একটি গ্রুপ তৈরি পরিচালনা করে, তাদের অগ্রাধিকারগুলি সেট করে এবং সেই থ্রেডগুলির মধ্যে কীভাবে কাজটি বিতরণ করা হয় তা পরিচালনা করে। কাজের চাপ বাড়ার বা হ্রাস হওয়ার সাথে সাথে ক্লাসটি কাজের চাপের সাথে সামঞ্জস্য করতে আরও থ্রেড ছড়িয়ে দেয় বা ধ্বংস করে।
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
আপনি আরও বিশদের জন্য তৈরি-থ্রেডপুলে এই বিকাশকারী গাইড নিবন্ধটি উল্লেখ করতে পারেন ।
Handlerএকাধিক চলমান উদাহরণগুলি চালনার জন্য এই পোস্টটি একবার দেখুন । এই ক্ষেত্রে, সমস্ত Runnableকাজ একক থ্রেডে চলবে।
অ্যান্ড্রয়েড: একটি থ্রেড টোস্ট