অ্যাসিঙ্কটাস্ক doInBackground () থেকে স্টাফ চালানোর জন্য একটি থ্রেড পুল প্যাটার্ন ব্যবহার করে। ইস্যুটি প্রাথমিকভাবে (প্রারম্ভিক অ্যান্ড্রয়েড ওএস সংস্করণে) পুলের আকার মাত্র 1, যার অর্থ অ্যাসিঙ্কটাস্কের একগুচ্ছের জন্য কোনও সমান্তরাল গণনা নেই। তবে পরে তারা এটি স্থির করে এবং এখন আকারটি 5, সুতরাং সর্বাধিক 5 টি অ্যাসিঙ্কটাস্ক এক সাথে চলতে পারে। দুর্ভাগ্যক্রমে আমি মনে করি না কোন সংস্করণে তারা ঠিক সেই পরিবর্তন করেছিল।
হালনাগাদ:
এখানে বর্তমান (2012-01-27) এপিআই যা বলেছে তা এখানে:
প্রথম উপস্থাপিত হওয়ার পরে, AsyncTasks একক পটভূমির থ্রেডে সিরিয়ালি কার্যকর করা হয়েছিল। ডোনট দিয়ে শুরু করে, এটি থ্রেডের একটি পুলে পরিবর্তন করা হয়েছিল যাতে একাধিক কাজ সমান্তরালভাবে পরিচালিত হতে পারে। HONEYCOMB এর পরে, সমান্তরাল সম্পাদনার ফলে সৃষ্ট সাধারণ অ্যাপ্লিকেশন ত্রুটিগুলি এড়াতে এটি আবার একক থ্রেডে পরিবর্তন করার পরিকল্পনা করা হয়েছে। আপনি যদি সত্যই সমান্তরাল সম্পাদন করতে চান তবে আপনি THREAD_POOL_EXECUTOR এর সাথে এই পদ্ধতির এক্সিকিউটিভঅনেক্সেকিউটার (এক্সিকিউটার, প্যারামস ...) সংস্করণ ব্যবহার করতে পারেন; তবে, এর ব্যবহার সম্পর্কে সতর্কতার জন্য সেখানে মন্তব্য দেখুন।
ডানট হ'ল অ্যান্ড্রয়েড ১.।, হনিকোমবি অ্যান্ড্রয়েড 3.0.০
আপডেট: 2
kabuko
থেকে মন্তব্য দেখুন Mar 7 2012 at 1:27
।
দেখা যাচ্ছে যে এপিআইগুলির জন্য যেখানে "একাধিক কাজ সমান্তরালভাবে পরিচালিত করার জন্য থ্রেডের পুল" ব্যবহার করা হয় (1.6 থেকে শুরু হয়ে 3.0 এ শেষ হবে) একই সাথে চলমান অ্যাসিঙ্কটাস্কের সংখ্যা ইতিমধ্যে কার্যকর হওয়ার জন্য কতগুলি কার্য পাশ হয়েছে তার উপর নির্ভর করে, তবে তাদের doInBackground()
এখনও শেষ হয়নি।
এটি আমার দ্বারা পরীক্ষিত / নিশ্চিত হয়েছে ২.২। ধরুন আপনার কাছে এমন একটি কাস্টম অ্যাসিঙ্কটাস্ক রয়েছে যা কেবলমাত্র একটি সেকেন্ডের মধ্যে ঘুমায় doInBackground()
। অ্যাসিঙ্কটাস্ক বিলম্বিত কার্যগুলি সংরক্ষণের জন্য অভ্যন্তরীণভাবে একটি নির্দিষ্ট আকারের সারি ব্যবহার করে। ডিফল্টরূপে সারিটির আকার 10। আপনি যদি একটানা 15 টি নিজস্ব কাস্টম কাজ শুরু করেন তবে প্রথমে 5 টি তাদের প্রবেশ করবে doInBackground()
তবে বাকীগুলি নিখরচায় কর্মী থ্রেডের জন্য অপেক্ষা করবে। প্রথম 5 টির মধ্যে যে কোনওটি শেষ হওয়ার সাথে সাথে এইভাবে কোনও শ্রমিকের থ্রেড প্রকাশিত হবে, সারি থেকে একটি কার্য সম্পাদন শুরু হবে। সুতরাং এক্ষেত্রে সর্বাধিক 5 টি কাজ এক সাথে চলবে। তবে আপনি যদি একটানা 16 টি নিজস্ব কাস্টম কাজ শুরু করেন তবে প্রথমে 5 টি তাদের প্রবেশ করবে doInBackground()
, বাকি 10 টি কাতারে প্রবেশ করবে, তবে 16 তম জন্য একটি নতুন কর্মী থ্রেড তৈরি হবে যাতে এটি অবিলম্বে কার্যকর করা শুরু করবে execution সুতরাং এক্ষেত্রে সর্বাধিক 6 টি কার্য চলবে।
একসাথে কতগুলি কাজ চালানো যায় তার একটি সীমা রয়েছে। যেহেতু AsyncTask
সীমিত সর্বোচ্চ সংখ্যক কর্মী থ্রেড (128) সহ একটি থ্রেড পুল নির্বাহক ব্যবহার করেন এবং বিলম্বিত কার্যগুলির সারিতে 10 টি নির্দিষ্ট আকার রয়েছে, যদি আপনি 138 টিরও বেশি কার্যকর করার চেষ্টা করেন তবে অ্যাপ্লিকেশনটি আপনার ক্রাস্ট হয়ে যাবে java.util.concurrent.RejectedExecutionException
।
3.0 থেকে শুরু করে এপিআই AsyncTask.executeOnExecutor(Executor exec, Params... params)
পদ্ধতির মাধ্যমে আপনার কাস্টম থ্রেড পুল নির্বাহককে ব্যবহার করতে দেয় । উদাহরণস্বরূপ, এটি ডিফল্ট 10 আপনার যা প্রয়োজন তা না হলে বিলম্বিত কার্য সারির আকারটি কনফিগার করতে দেয়।
@ ননসোস যেমন উল্লেখ করেছেন, AsyncTaskCompat.executeParallel(task, params);
এপিআই স্তরের সাথে বিরক্ত না করে সমান্তরালে কাজগুলি চালনার জন্য সমর্থন ভি ৪ লাইব্রেরি থেকে একটি বিকল্প রয়েছে । এই পদ্ধতিটি 26.0.0 এপিআই স্তরে হ্রাস পেয়েছে।
আপডেট: 3
ক্রিয়াকলাপ বনাম সমান্তরাল সম্পাদনের সংখ্যা সহ খেলতে এখানে একটি সাধারণ পরীক্ষার অ্যাপ্লিকেশন: https://github.com/vitkhudenko/test_asynctask
আপডেট: 4 (এটি প্রকাশ করার জন্য ধন্যবাদ @ স্পেনজুউ)
অ্যান্ড্রয়েড ৪.৪ থেকে শুরু AsyncTask
করে আপডেট: ২ বিভাগে বর্ণিত থেকে আলাদা আচরণ করে । সেখানে একটি ফিক্স আছে প্রতিরোধ AsyncTask
অনেকগুলি থ্রেড তৈরি করা থেকে।
অ্যান্ড্রয়েড ৪.৪ (এপিআই 19) AsyncTask
এর আগে নিম্নলিখিত ক্ষেত্রগুলি ছিল:
private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(10);
অ্যান্ড্রয়েড ৪.৪ (এপিআই ১৯) এ উপরের ক্ষেত্রগুলি এতে পরিবর্তন করা হয়েছে:
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
এই পরিবর্তনটি কাতারের আকার 128 আইটেমে বৃদ্ধি করে এবং থ্রেডের সর্বাধিক সংখ্যাকে সিপিইউ কোর * 2 + 1 এর সাথে হ্রাস করে Apps অ্যাপসটি এখনও একই সংখ্যক কাজ জমা দিতে পারে।