تا %60 تخفیف خرید برای 3 نفر با صدور مدرک فقط تا
00 00 00
در توسینسو تدریس کنید

آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading

با سلام به همه دوستان و همراهان عزیز Itpro. زبان برنامه نویسی جاوا یک زبان multi thread(چند نخی) است. این به این معنی است که می توان با استفاده از این زبان می توان برنامه هایی نوشت که چندین thread را با هم اجرا نمایند. هر واحد که یک قسمت از کد را اجرا می کند را یک thread یا نخ نام دارد. یک برنامه multi thread شامل چند بخش است که می توانند با هم و موازی اجرا شوند و هرکدام یک وظیفه جدا در یک زمان انجام دهند و این باعث می شود که برنامه در زمان کمتری اجرا شود و از منابع موجود استفاده بهتری بکنند. برای درک بهتر این مفهوم ابتدا مفهوم چندوظیفه ای بودن یا multitasking را تعریف می کنیم. چندوظیفه ای بودن به این معنی است که چند برنامه یک CPU را به اشتراک بگذارند و هرکدام از آن به گونه ای استفاده کنند که بقیه پردازش ها و برنامه ها نیز به اندازه نیاز خود از آن استفاده نمایند. این عمل توسط سیستم عامل انجام می شود. حال اگر بخواهیم این چندوظیفه ای را در سطح یک برنامه پیاده کنیم به آن چندنخی یا multi-threading می گویند. به این شکل که کل برنامه را به بخش های مختلفی تقسیم می کنیم و برای اجرای هر بخش یک thread می سازیم. این thread ها به طور موازی باهم اجرا خواهند شد. سیستم عامل علاوه بر این که زمان پردازش CPU را بین برنامه ها تقسم می کند همچنین زمان یک برنامه را بین thread های مختلف آن نیز تقسیم می نماید.

دوره حیات یک thread

یک thread مراحل مختلفی در طول حیات خود طی می کند برای مثال یک thread ساخته می شود و استارت می خورد و اجرا می شود و سپس از بین می رود. تصویر زیر کل مراحل حیات یک ترد را نشان می دهد.

آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading

مفاهیم هرکدام از مراحلی که در تصویر آمده است رادر ادامه توضیح داده ایم:

  • NEW یک ترد جدید مرحله اول حیات خود را که همان ایجاد شدن است را آغاز می کند. این ترد تا زمانی که برنامه آن را اجرا نکند در همین مرحله باقی خواهد ماند.
  • Runnable پس از این که یک ترد جدید ایجاد شد ترد قابل اجرا خواهد شد. در این مرحله ترد آماده است تا وظیفه خویش را انجام دهد.
  • Waiting: گاهی اوقات یک ترد به مرحله انتظار یا waiting می رسد. این حالت زمانی اتفاق می افتد که ترد باید صبر کند تا یک کار تمام شود. بعد از این که کار مورد نظر به اتمام رسید وضعیت تر از حالت waiting به حالت runnable تغییر خواهد کرد. البته این تغییر حالت فقط در زمانی اتفاق می افتد که یک ترد دیگر به ترد در حال انتظار خبر بدهد که می تواند اجرای خود را ادامه دهد.
  • Timed waiting یک ترد که در حالت runnable قرار دارد می تواند به وضعیت Timed waiting با یک زمان مشخص دربیاید. در این حالت ترد در مدت زمان مشخص شده در حالت waiting است و پس از آن به حالت runnable بازخواهد گشت.
  • Terminated(Dead) یک ترد وقتی که کارش تمام شد به این مرحله می رسد در این مرحله ترد از بین خواهد رفت. دقت کنید که گاهی اوقات ترد بدون این که کارش تمام شود ممکن است به این حالت برسد. مثلا اگر یک برنامه دیگر ترد را از بین ببرد.

اولویت بین ترد ها

هر ترد در جاوا یک اولویت دارد. این اولویت بندی ترد ها به سیستم عامل کمک می کند تا بتواند تردها را زمانبندی نماید. در جاوا اولویت تردها یک عدد بین MIN__PRIORITY(که عدد یک است) تا MAX__PRIORITY(که عدد 10 است) می باشد. به طور پیش فرض هر ترد که در جاوا ساخته می شود اولویت آن NORM__PRIORITY می باشد که همان عدد 5 است. ترد هایی که شماره اولویت آنها بالاتر است تردهای مهمتری هستند و باید قبل از این که به تردهای با شماره کمتر cpu داده شود به این ترد ها cpu داده شود. به عبارت دیگر سیستم عامل ابتدا به تردهای با اولویت بالاتر پردازنده می دهد و سپس به تردهای با اولویت پایین تر می رسد. البته همیشه نمی توان ضمانت کرد که این ترتیب حفظ شود و گاهی ممکن است که ترد با اولویت پایین تر نیز اجرا شود.

دقت داشته باشید که اگر شما در برنامه خود از ترد استفاده نکنید برنامه شما فقط یک ترد خواهد داشت. ممکن است در حین اجرای برنامه حالتی پیش بیاید که بخواهیم اجرای یک ترد را متوقف کنیم و آن ترد را از بین ببریم. در نسخه های قبلی جاوا متدی به نام stop برای متوقف کردن ترد وجود داشت ولی در نسخه های کنونی این متد از داخل کتابخانه های جاوا حذف شده است. در عوض به جای متد stop متدی به نام interrupt ارائه شده است که این متد باعث می شود که درخواست کنیم که ترد متوقف شود. وقتی که متد interrupt برای تردی فراخوانی شود وضعیت interrupted ترد تغییر می کند که می توان با استفاده از متد isInterrupted به این وضعیت دسترسی داشت.

دقت داشته باشید که زمانی که یک ترد بلوکه شده است نمی توان وضعیت interrupt آن را چک کرد. در این حالت InterruptedException رخ خواهد داد. در این مطلب به بررسی مفهوم multi-thread پرداخته شد. یکی از مسائلی که در مواجهه با ترد ها در جاوا وجود دارد این است که وقتی که دو یا چند ترد با هم در حال اجرا هستند باید چگونه بین آنها همگام سازی انجام شود. برای مثال اگر دو ترد در یک زمان یک مقدار را از یک فایل می خوانند و آن را تغییر می دهند چگونه باید کاری کرد که مقدار داده نادرست در آن درج نشود. به این گونه مسائل مسائل synchronization یا همگام سازی گفته می شود که یک بحث جدی در مدیریت ترد ها می باشد که باید توسط نویسنده برنامه به درستی مدیریت شود تا برنامه دچار اشکالات منطقی و داده ای نباشد. در مطالب بعدی به بیان نحوه پیاده سازی ترد ها در جاوا و انواع استفاده از آنها و مسائلی که در رابطه با ترد ها ممکن است مطرح شود خواهیم پرداخت. Itpro باشید

نویسنده: مهدی عادلی فر

منبع: جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

نظر شما
برای ارسال نظر باید وارد شوید.
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

افرادی که این مطلب را خواندند مطالب زیر را هم خوانده اند