در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش جاوا (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 باشید

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

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

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

#multithreading_چیست #آموزش_چندنخی_در_جاوا #مولتی_ترد_در_جاوا #برنامه_نویسی_جاوا #آموزش_برنامه_نویسی_جاوا #آموزش_جاوا #کار_با_تردها_در_جاوا #آموزش_گام_به_گام_جاوا #همگام_سازی_تردها_در_جاوا #دوره_آموزشی_جاوا
عنوان
1 آموزش جاوا (Java) قسمت 1 : معرفی ، خصوصیات و شروع به کار رایگان
2 آموزش جاوا (Java) قسمت 2 : شی گرایی قسمت یک رایگان
3 آموزش جاوا (Java) قسمت 3: شی گرایی قسمت دو رایگان
4 آموزش جاوا (Java) قسمت 4 : شی گرایی قسمت سه رایگان
5 آموزش جاوا (Java) قسمت 5 : انواع داده رایگان
6 آموزش جاوا (Java) قسمت 6 : انواع متغیر رایگان
7 آموزش جاوا (Java) قسمت 7 : Modifier ها رایگان
8 آموزش جاوا (Java) قسمت 8 : عملگرها قسمت یک رایگان
9 آموزش جاوا (Java) قسمت 9 : عملگرها قسمت دو رایگان
10 آموزش جاوا (Java) قسمت 10 : حلقه های تکرار رایگان
11 آموزش جاوا (Java) قسمت 11 : عبارات شرطی رایگان
12 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
13 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
14 آموزش جاوا (Java) قسمت 14: کلاس Wrapper کاراکترها رایگان
15 آموزش جاوا (Java) قسمت 15 : کلاس String و کار با رشته قسمت یک رایگان
16 آموزش جاوا (Java) قسمت 16 : کلاس String و کار با رشته قسمت دو رایگان
17 آموزش جاوا (Java) قسمت 17 : کلاس String و کار با رشته قسمت سه رایگان
18 آموزش جاوا (Java) قسمت 18 : کلاس String و کار با رشته قسمت چهار رایگان
19 آموزش جاوا (Java) قسمت 19 : StringBuilder و StringBuffer رایگان
20 آموزش جاوا (Java) قسمت 20 : استفاده از آرایه ها رایگان
21 آموزش جاوا (Java) قسمت 21 : آموزش کار با تاریخ رایگان
22 آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression) رایگان
23 آموزش جاوا (Java) قسمت 23 : تعریف و استفاده از متدها قسمت یک رایگان
24 آموزش جاوا (Java) قسمت 24 : تعریف و استفاده از متدها قسمت دو رایگان
25 آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها رایگان
26 آموزش جاوا (Java) قسمت 26 : کار با دایرکتوری ها رایگان
27 آموزش جاوا (Java) قسمت 27 : کلاس ByteArrayInputStream رایگان
28 آموزش جاوا (Java) قسمت 28 : معرفی کلاس File و متدها رایگان
29 آموزش جاوا (Java) قسمت 29 : معرفی و شرح Exception ها قسمت 1 رایگان
30 آموزش جاوا (Java) قسمت 30 : معرفی و شرح Exception ها قسمت 2 رایگان
31 آموزش جاوا (Java) قسمت 31 : معرفی و شرح Exception ها قسمت 3 رایگان
32 آموزش جاوا (Java) قسمت 32 : استفاده از انوع کلاس های داخلی رایگان
33 آموزش جاوا (Java) قسمت 33 : وراثت کلاس ها و انواع آن رایگان
34 آموزش جاوا (Java) قسمت 34 : Override کردن متد ها رایگان
35 آموزش جاوا (Java) قسمت 35 : چند ریختی (Polymorphism) رایگان
36 آموزش جاوا (Java) قسمت 36 : Enum و ویژگی های آن رایگان
37 آموزش جاوا (Java) قسمت 37 : معرفی Abstract رایگان
38 آموزش جاوا (Java) قسمت 38 : استفاده از کپسول بندی (Encapsulation) رایگان
39 آموزش جاوا (Java) قسمت 39 : استفاده از اینترفیس ها رایگان
40 آموزش جاوا (Java) قسمت 40 : پکیج(Package) و نحوه استفاده رایگان
41 آموزش جاوا (Java) قسمت 41 : معرفی داده ساختارها Enumeration رایگان
42 آموزش جاوا (Java) قسمت 42 : داده ساختار BitSet رایگان
43 آموزش جاوا (Java) قسمت 43 : داده ساختار Vector رایگان
44 آموزش جاوا (Java) قسمت 44 : داده ساختار Stack (پشته) رایگان
45 آموزش جاوا (Java) قسمت 45 : داده ساختار Dictionary رایگان
46 آموزش جاوا (Java) قسمت 46 : داده ساختار Hashtable رایگان
47 آموزش جاوا (Java) قسمت 47 : داده ساختار Properites رایگان
48 آموزش جاوا (Java) قسمت 48 : معرفی و آموزش جنریک (Generic) رایگان
49 آموزش جاوا (Java) قسمت 49 : برنامه نویسی سوکت و شبکه قسمت 1 رایگان
50 آموزش جاوا (Java) قسمت 50 : برنامه نویسی سوکت و شبکه قسمت 2 رایگان
51 آموزش جاوا (Java) قسمت 51 : استفاده از Lambda Expression رایگان
52 آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading رایگان
53 آموزش جاوا (Java) قسمت 53 : Runnable در Thread و Multi-Threading رایگان
54 آموزش جاوا (Java) قسمت 54 : کلاس Thread و متدها رایگان
زمان و قیمت کل 0″ 0
0 نظر

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

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....