অ্যাসিঙ্কটাস্ক থ্রেড কখনও মারা যায় না


112

আমি AsyncTaskএকটি বোতাম টিপে ব্যবহারকারীর প্রতিক্রিয়া হিসাবে ডেটা আনার জন্য এস ব্যবহার করছি । এটি ভালভাবে কাজ করে এবং ডেটা আনার সময় ইন্টারফেসটি প্রতিক্রিয়াশীল রাখে, তবে যখন আমি গ্রহগ্রহের ডিবাগারে কী চলছে তা আমি যখন পরীক্ষা করেছিলাম তখন আমি জানতে পেরেছিলাম যে প্রতিবার একটি নতুন AsyncTaskতৈরি হয়েছিল (যা বেশিরভাগ ক্ষেত্রেই হয়, কারণ সেগুলি কেবল একবার ব্যবহার করা যেতে পারে) ), একটি নতুন থ্রেড তৈরি করা হচ্ছে তবে কখনই শেষ করা হয়নি।

ফলাফলটি কেবল AsyncTaskসেখানে বসে অনেকগুলি থ্রেড। আমি অনুশীলন করতে পারছি না যে এটি অনুশীলনে সমস্যা কিনা বা না, তবে আমি সত্যিই এই অতিরিক্ত থ্রেড থেকে মুক্তি পেতে চাই।

এই থ্রেডগুলিকে আমি কীভাবে হত্যা করতে পারি?


"কখনই অবসান হয় না" এর অর্থ কী? টাস্কটি কখনই এর ডিনব্যাকগ্রাউন্ড পদ্ধতিটি শেষ করে না বা বরাদ্দকারীর মধ্যে আপনি কেবল অ্যাসিঙ্কটাস্ক বস্তুটি দেখতে পাচ্ছেন?
ফ্রান্সেসকো লরিটা

7
doInBackgroundপদ্ধতি সমাপ্ত কিন্তু থ্রেড ডিবাগ উইন্ডোতে দেখা চলতে। উদাহরণস্বরূপ: Thread [<23> AsyncTask #4](Running)
কম্পিউটারিশ

উত্তর:


202

AsyncTaskথ্রেড পুল পরিচালনা করে, এর সাথে তৈরি ThreadPoolExecutor। এটি 5 থেকে 128 থ্রেডে থাকবে। যদি 5 টিরও বেশি থ্রেড থাকে তবে সেই অতিরিক্ত থ্রেডগুলি সরানোর আগে প্রায় 10 সেকেন্ডের জন্য স্থির থাকবে stick (দ্রষ্টব্য: এই পরিসংখ্যানগুলি বর্তমানে দৃশ্যমান ওপেন সোর্স কোডের জন্য এবং অ্যান্ড্রয়েড রিলিজের দ্বারা পরিবর্তিত হয়)।

AsyncTaskদয়া করে থ্রেডগুলি একা ছেড়ে দিন ।


ব্যাখ্যার জন্য ধন্যবাদ! আমি জেনে খুশি হয়েছি যে আমি কোনও ভুল করছি না। কৌতূহলের বাইরে কেন এটি এমনভাবে তৈরি করা হয়েছে? সমস্ত পদ্ধতি ফিরে আসার পরে কেন কেবল থ্রেডগুলি শেষ করবেন না?
কম্পিউটারিশ

7
পরে অনুরোধে থ্রেড কাঁটাচামচ করার সময় সাশ্রয় করার সম্ভাবনা রয়েছে।
কমন্সওয়্যার

@ কমন্সওয়্যার আমার একটি পরিষেবা রয়েছে যাতে আমি কিছু অপারেশন সম্পাদন করার জন্য একটি অ্যাসিঙ্কটাস্ক চালাচ্ছি এবং উইজেট বোতামটি চাপার সাথে সাথে পরিষেবাটি শুরু হয় এবং যখন কাজটি শেষ হয় তবে অবশ্যই সার্ভিটি তত্ক্ষণাত বন্ধ করা উচিত, তবে কখনও কখনও অ্যাসিঙ্কটাস্ক মারা যাবে না, তাই আপনি কি করতে পারেন কীভাবে এটি বন্ধ করব আমাকে বলুন
হান্ট

1
@ শ্রীকান্ত কারুমানঘাট: AsyncTaskএমন কিছু ব্যবহারের জন্য যা দীর্ঘ সময় নিতে পারে, এটি সাধারণভাবে একটি খারাপ ধারণা। তবে না, অতিরিক্ত থ্রেডগুলি চলে যাওয়ার বিষয়ে আমার মন্তব্যগুলি যখন তারা অব্যবহৃত হয়। সুতরাং, যখন আপনার 6 টির মধ্যে একটি কাজ শেষ হয়, তখন এর থ্রেডটি 10 ​​সেকেন্ডের জন্য পুলে থাকবে, তার পরে সেই থ্রেডটি সমাপ্ত হবে।
কমন্সওয়্যার

1
@ শ্রীকান্তকর্মণাঘাট: "আমার প্রশ্ন হচ্ছে সমানতালে অ্যাসিঙ্কটাস্ক চালানোর জন্য ২০ টি (কি বলে) কোনও নিষেধাজ্ঞান রয়েছে?" - AsyncTaskআজকের উল্লেখযোগ্য ব্যবহার করা কোনও দুর্দান্ত পরিকল্পনা নয়। ২০++ যা 10+ সেকেন্ড চলতে পারে তা এমন একটি ধরণের জিনিস যা কোনও কোড পর্যালোচনাতে ব্যর্থ হওয়া উচিত। যদি আপনি দ্রুত ধারাবাহিকতায় 20 টি কার্য তৈরি করেন তবে কয়েকটি মাত্র একবারে চলবে এবং বাকিগুলি পরে সম্পাদনের জন্য সারিবদ্ধ থাকবে। একসাথে কতজন চলবে তা সিপিইউর কর সংখ্যার উপর ভিত্তি করে। আফাইক, বর্তমান অ্যালগরিদমটি 2N + 1 সমান্তরাল থ্রেড, যেখানে এন কোরগুলির সংখ্যা।
কমন্সওয়্যার

24

কমন্সওয়্যারের প্রতিক্রিয়া ছাড়াও:

বর্তমানে আমি অ্যান্ড্রয়েড ২.২ ব্যবহার করছি এবং আমার অ্যাপ্লিকেশনটি কোনও সময়ে একাধিক অ্যাসিঙ্কটাস্ক ব্যবহার করে না, তবে প্রতি x মিনিটে আমি একটি নতুন তৈরি করছি। প্রথমে নতুন অ্যাসিঙ্কটাস্ক থ্রেডগুলি প্রদর্শিত হতে শুরু করে (নতুন অ্যাসিঙ্কটাস্কের জন্য একটি নতুন থ্রেড) তবে 5 টি থ্রেড পরে (কমন্সওয়্যার দ্বারা উল্লিখিত) এগুলি কেবল ডিবাগ উইন্ডোতে দৃশ্যমান থাকে এবং নতুন এসিঙ্কটাস্ক থ্রেডগুলির প্রয়োজন হলে পুনরায় ব্যবহৃত হয়। ডিবাগার সংযোগ বিচ্ছিন্ন না হওয়া পর্যন্ত তারা কেবল সেখানেই থাকে।


2
হ্যাঁ, নিশ্চিত হয়েছে: আমি 5 টির বেশি এসিঙ্কটাস্ক দেখতে পাচ্ছি না।
সেরফিমের

3

এখানে একই লক্ষণ। আমার ক্ষেত্রে ক্রিয়াকলাপটি মেরে ফেলার পরে থ্রেডগুলি ঝুলিয়ে দেওয়া হয়েছিল এবং আমি অ্যাপটি পুরোপুরি বন্ধ হয়ে যাওয়ার আশা করছিলাম। একক থ্রেডেড এক্সিকিউটার ব্যবহার করে আংশিক সমস্যা সমাধান হয়েছে:

    myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());

এটি থ্রেডটির কাজ শেষ হওয়ার পরে বিলুপ্ত হয়ে যায়।


এই উত্তরটি AsyncTask দৌড়ানোর পরে দূরে সরে যায়, সম্ভবত এটি "স্টাফ করার গুগল উপায়" নয় তবে এটি কাজটি সম্পন্ন করে। ধন্যবাদ.
হেনরিক ডি সোসা

এটি একক থ্রেডে অ্যাসিঙ্কটাস্ক চালানোর বিষয়ে আমার নির্দিষ্ট সমস্যার সমাধান করেছে।
ল গিমেনেজ

0

থ্রেডপুলএক্সেকিউটার ব্যবহার করুন ।

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);

এক্সিকিউট () পদ্ধতি Runnableব্যবহার করে আপনার কার্য পোস্ট করুন ।

void execute (Runnable command)

ভবিষ্যতে কোনও সময় প্রদত্ত কাজটি কার্যকর করে। টাস্কটি একটি নতুন থ্রেড বা বিদ্যমান পুলযুক্ত থ্রেডে কার্যকর করতে পারে

আপনার দ্বিতীয় প্রশ্ন সম্পর্কিত:

এই থ্রেডগুলিকে আমি কীভাবে হত্যা করতে পারি?

আপনার সমস্ত কাজ একবার সম্পন্ন করার পরে ThreadPoolExecutorনীচের পোস্টে উদ্ধৃত হিসাবে এটি সঠিকভাবে বন্ধ করুন:

কিভাবে জাভা এক্সিকিউটর সার্ভিস সঠিকভাবে বন্ধ করবেন shut

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.