تردینگ در اندروید1

به نام خدا

تردینگ در اندروید


برای بحث تردینگ ابتدا در این مقاله سعی می‌کنیم مباحث اصلی تردینگ و main thread را توضیح دهیم و بعد در مقاله‌های بعدی، سراغ بست پرکتیس‌ها می‌رویم.

  • mainThread

وقتی که اپلیکیشنی ران می‌شود، یک linux Process ایجاد می‌شود که به آن ترد اصلی نرم‌افزار یاmain thread می‌گوییم.

تنها کار آن اجرای بلاک‌های مختلف است

که باید دقت کنیم فقط کارهای مربوط به ui را روی آن ترد انجام بدهیم.

مِیْن ترد دوست دارد تسک‌هایش را در کمتر از شانزده میلی‌ثانیه انجام بدهد (شصت فریم بر ثانیه) تا کاربر احساس نکند لگ وجود دارد.

دقیقاً زمانی که احساس می‌کنیم برنامه‌ای کند عمل می‌کند، به این دلیل است که صف این ترد این‌قدر شلوغ است و این‌قدر کارهای سنگین انجام می‌دهد که کارش بیشتر از این زمان (شانزده میلی‌ثانیه) طول می‌کشد.

اگر این کندی به حدی زیاد بشود که تا بیش از پنج ثانیه طول بکشد، دیالوگی را نشان می‌دهد.

Application Not Responding

و در اصطلاح می‌گوییم ANR رخ داده است.

چه کارهایی را روی ترد اصلی انجام بدهیم؟

{Ui object

Create,

Update,

Destroy

}

انجام این فعالیت‌ها روی آبجکت‌های یوای , ترد امن (Thread safe) نیست،

یعنی نمی‌توانیم این کدها را روی تردهای دیگر ران کنیم، کرش می‌کنیم یا ایرادهای دیگر به وجود می‌آید

.

چه کارهایی را روی ترد اصلی انجام ندهیم؟

باید اصلی کلی را به خاطر بسپاریم و آن اینکه کارهای سنگین را روی ترد اصلی انجام ندهیم.

این وظیفه‌ها را به تردهای دیگر بسپاریم.

همین جا یک نکتۀ مهم وجود دارد:
باید حتماً به تردها دیتای IMMUTABLE بدهیم و یک شیء را بین چند تا ترد به اشتراک نگذاریم ، چراکه ممکن است اتفاق‌های بدی بیفتد.

ماندگاری ترد چطور باشد؟

دو نوع ترد داریم:

تردهای اول در نهایت فقط می‌خواهند روی یو ای اثر بگذارند.

در اینجا اگر تا قبل از رسیدن جواب، ترد اکتیویتی از بین برود، لزومی ندارد ترد را بعد از بین رفتن اکتیویتی مربوط نگه داریم.

از بین بردن این تردها معمولاً کار زجرآوری است و یادمان می‌رود، پس بهتر است از ابزارهایی مثل لایو دیتا استفاده کنیم، بدون اینکه دیگر نگران از بین رفتن این lifeCycle باشیم.

برخی تردها هم کارهای دیگر می‌کنند که فرضاً برای ما کار مفیدی است. مثلاً دیتایی را کش می‌کنند یا دانلود می‌کنند. اینجا حتی اگر اکتیویتی بسته بشود، بهتر است این فعالیت ادامه پیدا کند و کارش را تمام کند. (البته باز هم به کسب‌وکار ما بستگی دارد.)

اولویت‌بندی ترد THREAD PRIORITY

میزان اولویت تردها تا حد زیادی به lifeCycle و کسب‌وکار شما مربوط می‌شود.

اما خوب است بدانیم اگر high Thread priority باشد،

روی مِیْن ترد اثر می‌گذارد و به آن می‌گوییم: رندر ترد renderThread

و امکان دارد باعث افت فریم برنامه بشود.

و اگر خیلی کم باشد، امکان دارد کار در اولویت خیلی پایینی انجام بشود و آن زمانی که بهش نیاز داریم، به دستمان نرسد.

در اندروید، سیستم عامل ۹۵ درصد منبع دستگاه را اختصاص می‌دهد به foreground thread و فقط پنج درصد مربوط به background thread می‌شود.

به‌طور معمول، اگر شما یک ترد را خودتان ایجاد کنید priority را از ترد والد ارث می‌برد، مگر اینکه شما آن را تغییر بدهید.

اینجا می‌توانیم اولویت تردمان را مشخص کنیم.

process.setThreadPriority
-20 <= ThreadPriority <= 19

کمترین اولویت 19 است و بیشترین اولویت -20

برای راحتی thread یک اینترفیسی دارد برای ست کردن پرایرتی،

Thread.priority

که اینجا

1 <= Priority <= 10

به اصطلاح به این مقدار می‌گوییم: nice value.

که در واقع مپی هست برای ست کردن process.setThreadPriority


ترد مین normPrirority است و هر تردی که می‌سازیم، همچون والدش ترد مین است و به‌صورت دیفالت همین عدد پنج برایش تنظیم شده است.

راه راحت‌تر

راه راحت‌ترِ استفاده از ترد , استفاده از helper Classهاست.

مثل coroutine برای کاتلین یا handler ، executorو... که ان‌شاءالله بعداً بیشتر راجع به این موارد هم توضیح می‌دهیم.

چه مقدار ترد بسازیم

کلاً ساخت ترد هزینۀ زیادی دارد

و باید توجه کرد که منابع ما هم محدود است. پس، بهتر است که تا جایی که می‌شود، کمتر ترد ایجاد کنیم.

هر دیوایس می‌تواند تعداد محدودی ترد را هم‌زمان ران کند.

از نگرانی‌های دیگری که برای تعداد زیادی ترد وجود دارد، این است که آن‌ها را آزاد نکنیم.

این خودش عامل بدی می‌شود برای مموری لیک، چون هر ترد حداقل ۶۴ کیلو بایت رم مصرف می‌کند.

(این‌ها را می‌توان با ابزاری مثل systrace آزمایش کرد و برنامه را در مقایسه با آن بهبود داد.)

خیلی وقت‌ها برای اینکه تردی را اضافه نسازیم یا اینکه از یک ترد برای چند کار استفاده کنیم، باید از مفهومی به نام استخر تردها :) threadPool استفاده بکنیم

که این را هم می‌گذاریم برای مقالۀ بعدی ان‌شاءالله.

ممنون از همراهی‌تان