بسم الله والحمد لله والصلاة والسلام على رسول الله
اليوم إن شاء الله تعالى هنتكلم على موضوع من أهم
الموضوعات تميزت فيها الجافة عن لغات البرمجة
التانية اللي هي ال multi threading كلنا بنعرفإن
المعالجات اليوم في عليها multi cores مصبوط يعني
بين جسين هو عبارة عن compound CPU في المعالج واحد
في داخله أكتر من معالج أو أكتر من معالج الآن في
واحدة من المصطلحات اللي مرت علينا مع المقدمة
المفروض أو أخدتها أو أخدت بعضها في ال operating
system لو أخدتيها بس غالبا مرت عليك في المقدمة لما
أنا باتكلم عليهمصطلح الـ Multitasking Multitasking
يعني أنا بتكلم على قدرة الكمبيوتر على تنفيذ أكتر
من مهمة في نفس الوقت، مصبوط؟ الآن هذا بشكل عام
المصطلح، الآن لما بنروح ندقق في المصطلح هذا بنقدر
نفصله لمصطلحين ونقول ان ال multitasking أو انجسم
ال multitasking لنوعين ال process based وهذا شغل
ال operating systemبالدرجة الأولى و thread based
شغل البروجرام أو ال applications operating
system و application إيش مقصود في ال process
based؟أيوة بتكلم على process based ان ال operating
system قادر على تشغيل multitask تمام في نفس الوقت
وكل task هذه هي عبارة عن different application فال
process هذه انا بدي اتكلم عليها هي عبارة عن
application
الان process based معناته ان انا في عندى اكثر من
برنامج شغال بشكل متزامن هالكلام هذا بيصير معانا في
ال operating system اللي بنشتغل عليها سواء كانت
ويندوز او لينيكس او ماك بيصير انا بشغل ال word او
بشغل ال netpens بشغل ال word بشغل ال powerpoint و
ممكن اشغل ال player و ممكن اشغل ال internet
explorer و كل البرامج هذه شغالةبشكل متزامن مع
بعضها و ال CPU بجسم وجهته عليهم بالتساوي فهنا
بنقول ال process based هي ان يكون فيه عندى two
more or more application or programs run
concurrently بيشتغلوا بشكل متزامن مع بعضهم وهذا
المثال اللي بنشوفه كل يوم تمامتاني طبعا وهذا شغل
ال operating system انت بتقدرش تعمل لبرنامج يشغل
برامج تانية انت بتقدر تعمل لبرنامج يقول ال
operating system شغل كذا بس البرنامج مش هو اللي
هيشغل ال type التاني في ال multitasking ال thread
based ان ال application الواحد يكون عنده القدرة
على تنفيذ اكثر من task في نفس الوقتطب احنا عادة
دكتور يعني بنقول والله بشغل ال real player او ال
media player عشان يقرأ الفيديو او الملف الصوت اللي
عندى طب بس مقدرش يسوي شغلة انا ماقلتش كل ال
applications اللي بتقدر تسوي multitasking على
thread based لكن لو انا احنا جينا مثال لو كان عندك
word document word document حجمه خمسين صفحة على
سبيل المثال وروحتي عملتي print تمام؟وشفت شغلك
وقعدت تتعدل في ال formatting تبعته بدك انت تعمل
draft بدك تطبعيه وقعدت تعمل format لأن عملية ال
formatting وعملية ال printing لان قاعدة تتصير بشكل
متزاوي متوازي عفوا الفكرة وين ان هو راح بعت أو بده
يبعت ال document صفحة ورا تانية لل printer ماخلصش
عشان هيك أنا قلت لك خمسين صفحة لأنه هياخدك شويه
طويل في الإرسال هتحسيه حتى في ال status bar بكتب
لك printing أو sending document to printer هى هو
بيبعت الطباعة و أنت جاعد بتعمل ايش؟ formatting في
نفس اللحظة هذا احنا بنسميها ايش؟ thread based
thread based انه انا اعمل branch في الشغل نفسه انه
ال application الواحد يكون قادر ينفذ two tasks او
اكتر طيبالشغل التاني اللي انا بدي نفهمها الآن عادة
لو انا عملت application ال application هذا بيكون
sequential execution يعني لو انا اجيت اعملت برنامج
واحد اتنين تلاتة هذا اللغة من أسطر في
عشرة line عشر أسطرتخيلي ان في الصبر الأول عرفت
integer a equal كذا و b equal كذا big integer
تمام؟ عرفت a و b و بديت أحسب ال factorial مضروب ال
a و ال b هان بديت في مضروب ال a قلت fa equal واحد
و روحت هان قلت له whileالـ A أكبر من واحد ال F A
equal F A ضرب A minus minus تصير؟ تمام وهي في عند
طبعتها S out ال F A وروحت كمان مرة F B نفس ال code
عشان يعمل ال factorial تبعت ال B while
ال B أكبر من واحدالـ FB بدها تساوي FB ضرب B minus
minus as out FB وهان as out end of a program
البرنامج
لما بتنفذ هيتنفذ بشكل sequential مظبوط يعني سطر
الأول التانيتالت .. تالت والرابح هتظل يعمل تكرار
لما يخلص و لما أنا قولت هدول big integers ماعرفت
أنا بتكلم على عد ضخم يعني اللوب هاد إيش هصير فيها
هتاخد وجد لما ياشت .. هتخلص طيب .. و هانمن ستة
لتسعة مالاش علاقة بال code السابق اللي هم اتنين
لخمسة ولا لا؟ مافيش dependence في ال code وبالتالي
هذه جاعدة بتنتظر في ال queue من أجل لا شيء على
الرغم انه المعالج عنده القدرة ان ينفذها وينفذ كتير
زيها لأنه بنتكلم على multi course مظبوط؟ وغالبا
احنا لو احنا فتحنا ال task manager تبع ال
operating system I ALT CTRL DELETEطلعنا على ال
task manager ال
CPU زيك جداش؟ صفر في المية لأن كل البرامج اللي
شغالة stable مافيش عليها أي interaction بصير في
شغل لو أنا بدأت أعمل click أو بدأت أروح أسوي أي
شغلة هتحس أنه بنفذها و بعود بيرجعاش لل state يعني
بين جثين معظم لواجهة ال CPU عادل فاضيوقعد هو
بيشتغل في single task طب ليش مانا أروح أستفيد من
وجهته هذا؟ وبالتالي هنبدأ التفكير الجدي في أن أنا
أو جدأو كيف أقدر أعمل multitasking في ال
application تبعي يعني كيف يصير في عندي مقدرة angle
من خمسة لتسعة يتنفذوا بشكل متزامن لمن هنا خمسة،
ستة، سبعة، تسعة وبهيك بكون وفرت تقريبا اربعين في
المية من وجه المعالجي من وجه ال application تبعي
ليش؟ ليش اربعين في المية؟ الصدر الأول لازمنيلان
انا عرفت في الـA و الـB مظبوط والسطر الأخير لازمني
و هدولة بدهم يشتغلوا بشكل متزامن فهنا بتيجي موضوع
ال multitrading ان كيف اجدر اخلي برنامجي يشتغل او
يجسم الشغل او انا اجسم له شغل مافيش بينه
dependency و يشتغل عليه بشكل متزامن لازم نفرج بين
مصطلحين مهمات ال parallelism و ال concurrencyالشكل
أو الحوسبة المتوازية والحوسبة المتزامنة لما بتكلم
على متزامن concurrent شكل متزامن في نفس الوقت احنا
بنتكلم على single CPU بتكلم على single CPU لما
بتكلم على barrel بتكلم على اكثر من CPU الان
concurrent concurrency معناته انا جاعدالـ
application تبعي أو ال task تبعتي بدي اجسمها بحيث
ان المعالج يشغلها ب different time حسب المعالج
نفسه و طبعا كل واحدة بتمثل ال process عندها او
task بينما في ال parallel system ان انا بروح بجسم
ال task تبعتي على different machine يعني كل task
بديها لمachine مختلفة بديها لمachine مختلفة
الـ Thread البرانش هي عبارة عن الـ Basic
Processing Unit ايش يعني Basic Processing Unit؟
وحدة المعالجة الأساسية يعني هي بنتكلم عليها جزء من
وقت المعالج وجزء من الـ RAM من الـ Spaceلما احنا
بنتكلم عن الـ CPU دايما بنربط ال memory ال RAM و
المعالج بسميها وحدة المعالجة المركزية الان لما
اتكلم عن ال .. و هان ال thread هذه يعني هي الوحدة
الزمنية مينجو سيني نقدر نقولها اللي من خلالها ال
operating system بقول ال type .. ال CPU اشتغل على
ال task هاي طيب لو كان انا في عندى 10 task على
سبيل المثال
عشر مهام و بدي أخل ال system يشتغل بشكل متزامن على
العشر مهام هدول ايش بتروح أسوي؟ هروح أقول والله
بدي أجسم الفترة الزمنية تبعت ال CPU عليهم كلهم
يعني هيكد و بدي أفترض أن الوحدة الزمنية اللي أنا
بتكلم عليها واحد second ثانية واحدة هروح أقوله جسم
الثانية على عشر أجزاءوكل جزء ادي عشر ثانية اعمل
execution عنه بس يخلص الوجد انتقل لمن؟ للتاني
والتالت والرابع والخامس والسادس وهاكذا وكل ما يصير
في عندي update على ال process عيدي التجسيم وإذا
بتتذكر لما أخدت في المقدمة و document جزئية مقدمة
أو تعريف بال operating system جالك من مهام ال
operating system أو نظام التشغيل تنظيم
وقت المعالج ومر عليك شغلة اسمها الـ CPU scheduler
و ال CPU dispatcher مظبوط؟ ايش مهمتهم هدول؟ الان
ال dispatcher كان بيروح بيطلع في ال task اللي
بتبقى بنعملها run مين اللي شغاله و مين اللي خلص
اللي خلص بيروح بيشيله و بيروح بيبعت إشارة لل
scheduler انه الان في عندك process خلصتفبروح الـ
scheduler بيعيد تقسيم الوقت على ال task اللي ضايلة
ال dispatcher إجهة task جديدة بروح بقول لل
scheduler وقف الآن في عندي task جديدة جسم وهكذا
وهذا اللي بيصير في عندها فلما أنا بتكلم على thread
بتكلم على basic processing unit من خلالها ال
operating system بحدد وقت من وقت المعالج
processing time processor time لل thread اللي
موجود عندهاand more than one thread can be
executed inside a process وبالتالي بقدر انا
انافذها طيب انا داخل برنامجي هل بقدر اصل ال
operating system و اقوله اشتغل بالشغل هذا؟ المنطق
لأ انت بتشتغل على مستوى ال java virtual machine و
بتقول ال java virtual machine انا برنامجي بده
يشتغل concurrentالـ Java Virtual Machine بتروح
تبعت بروس إشارة للـ Operating System إنه أنا فيه
عندي كمان three different tasks كل واحد بتتعامل
معاها كإنها task مختلفة وبهيك أنا أكون بحقك أندي
الشغل كويس إيش الفائدة الأساسية من الـ
Multithreading Programming إنه أحصل على ال maximum
useللمعالج احنا عاملا شايفينه معظم الوجود هو فاضي
ايدل مابشتغلش وبالتالي انا بدي استفيد منه بشغل
افضل وبالتالي انا بدي اوصل ال maximum time ال
maximum usage بحيث ان اخلي وقت الفراغ عند المعالج
اقل وقت ممكن الان
ال CPUprocess واحد اتنين تلاتة اربعة سمناها
process based مظبوط process based لكن الان في ال
thread based في داخل ال process الواحدة انا بدي
اعمل run لمين لأكثر من ال process طبعا في عندي شغل
اسمها garbage collector بتخدمني في هالمجال ال task
او ال thread اللي بتخلصتولّى اذا مسحها من الـ
memory و من وقت المعالج اللي هي garbage collector
بروح بلمّم كل شغلة كل ال data كل ال temporary
locations اللي مرتها و بعملها free و برمي ال
unused data اللي موجودة عندنا في شغلنا احنا على
الأقل لما كنت بكتب sequential program بكتب
البرنامج على انه single threadيعني أنا ما بكتب الـ
main تمام بكتب single thread تمام، وان كانت هي ال
main ال thread اللي موجودة عندى طيب، الآن تعالى
نشوف مثال لو أنا في عندى سطر واحد و اتنين و تلاتة
و هان روحت أستدعي function و
ال function هذه فيها meet line
حجم برنامج كداش؟ كام سطر؟
حجم برنامج كل .. كام سطر؟ 103 103 line لأن هذه
height extension احنا ليش استخدمنا ال function
لشغلتين أساسيات؟Code Usability Reusability مظبوط
عشان أستخدم ال code مرة تانية و إما بديها أصير
أستدعيها بدل ما أضطر أكتبها و عشان ال code
maintenance لما أصلح في الكود هروح أصلح على ال
function نفسها وبالتالي كمان code organization
ترتيب لعملية ال code اللي عندي الآن مش هنتقل للسطر
تلاتة هنا إلا بعد ما هدول 100 سطر يخلصوا مظبوطالان
بالـ Multithreading اللي حيكون عندي كالتالي هو
أشبه بال function هيك هيكون الشغل لكن لما أنا أروح
أقول له استدعي ال function هذه خلاص مش هستنها لما
تخلص أروح أنتقل للصدر اللي وراها بشكل مباشر هي
فكرة ال concurrent ان انا الآن ماضلش واقف هنا
باستنى ان هذه تخلص عشان أنتقل لل next stepلأ في
الـ multitrading انه انا بقوله استدعى ال function
هذه و مباشرة بعد ما تم عملية ال calling بعمل move
ل ال next step بعملي شوية في المنطقة هذه اه ..
الآن لما بنشتج نتكلم على ال dependency لما نصير
نتكلم على ال dependency الوضع بده يختلف الآن اذا
كانت تلاتة معتمدة على اتنينما بقدرش أخد الـ step
عشان هيك أنا من البداية لما حطيت المثال ال
factorial تبعت ال a والمثال ال b مافيش بينهم
dependency مافيش بينهم اعتمادية مطلقا طيب
الـ main method has been invoked by desired class
وانت فعليا زي ما قلنا على الأقل عندي one thread من
خلال الـ main method انت استدعتيها ال thread بشكل
عام ال state تبعته او ال properties تبعته اما
بيكون شغال بيعمل processingأو بيعمل pause واقف
بيستنى شغلة بيستنى activity معينة بيستنى resource
معين بيستنى زمن معين عشان إيش يعمل resume و يكمل
ال
pause موجّف بشكل manual بيستنى
resource يتحرر
أو بنعمله terminated خلص شغله الآن احنا عايش أو
صار في error و بده ال thread هذا يطفئ تماما هو
حالة .. حالة البرنامج تماما تماما البرنامج اما
بكون شغال مصبوط او فعليا او ممكن اروح اوقفه من
خلال ال command اللي اسمه sleep وديه time بال
milisecond thread
أكتب في الداخل واضغط sleep مثلا تلت
تلاف ميلي ساكن معناته يمكنه يستنى أو ينام تلت
ثوانية ويكمل الشغل تمام؟ فانا بشكل او باخر وقفته
عن الشغل الآن او
blocked when waiting او في حالة block جاعد بيستنى
resource معين بده يقرأه لكن ال resource هذا محجوز
من خلال thread تاني او application تاني او عماله
بيستنى task او thread يخلص result و يقول اتفضل
فهذا يدخل في مرحلة ايش ال way او الحالة التالتة
الأخيرة terminated انه فعليا ان ال thread هذا لازم
يجف thread هذا لازم يجف لان ايش الفرق بين ال
terminated و ال paused او ال suspended ال paused
لا لا ال paused بقى بقدر اعمل resumeبخليه كمل ال
boss بخليه كمل terminated خلاص مافيش راجعة مافيش
راجعة و مافيش استمرارية في العمل بال Java في عندي
six states ست حالات من أجل تعريف أو بتعرف حالة ال
thread الحالة الأولى new عرفت ال thread لكني
مشغلتهوش
عرفت thread object بنيته و حددت ال task لكنه ما
دخلش في ال run runnable لما أنا بدأت أو حطيت ال
state في حالة execution بدأي شتغل blocked وانتبهي
كويس لأن ال state blocked هنا مفهومها أن ال thread
is waiting بينتظر ايش for a lock to access object
يعني الآنالـ thread بده يستنى الملف لما يتحرر عشان
إيش؟ ياخده، هذا في مرحلة إيش؟ Blocked Waiting
state in which الـ waiting أنه قاعد بيستنى thread
تاني يخلص ال action يخلص ال action في ال block هو
بيستنى مين؟ بيستنى ال resource يتحرر بيستنى ال
resource يتحرربالـ waiting هو بيستنى resource تانى
عشان ياخد ال action تبعته أو ياخد ال result منه ال
time waiting انا محدد زمن معين له thread هذا ان
اعمله pause بحيث انه يكون في ايه عندي ضمن فترة
زمنية معينة انا بدي اشغله و terminated انه انا بدي
اطفيه خلصتمام ليش هذه الحالات موجودة عندى هنا؟
عشان ممكن انا اسأل عن حالة ال thread اللى موجود
عندى في اى حالة عشان اقدر اكمل او اعرف اش اللى صار
عندى فى ال application لو انا بدى انشئ ال thread
عشان انشئ ال thread قدامي طريقتين طريقة الاولى بدى
اعمل extend لل thread class او طريقة التانية بدى
اعمل implement لل runnable interface يعني الآنالـ
application تبعي أو ال class اللي انا بدي اشتغله
بحيث انه يعمل multi-threading بدي يكون فيه او واحد
من حالتين اما عامل implement للـ runnable
interface او عامل extent لمين؟ لل thread طيب و في
كده الحالتين انا بدي اعمل implementation لمين؟
لميثود اسمها run اللي هي بتمثل ال main method ال
main method لل thread ال main method لل threadيعني
الآن لو أنا سألتك في ال application تبعتنا ال
application تبعتنا اللي احنا بنشتغله لحد اللحظة مش
في عندنا method دائما ببدأ منها دائما اللي هي ال
main ال main هذه نقطة البداية تحت ال main thread و
من هنا اسمها main الآن في ال thread اللي انا بدي
اعمله بدي انشئه هتكون نقطة بداية ال thread من مين؟
من الـ run نقطة بداية ال thread من ال run وما
تنسيش لما كتبت ال code قولت واحد اتنين تلاتة اربعة
خمسة ستة سبعة تمانية تسعة وعشرة وهذا بيصير شكل ال
application تبعي يعني واحد يعني
.. خلنا نسميه sequential execution في جزء معين بعد
هيكالـ sequential execution هذه مهمتها تكون حضرت
للـ threading وبعد ذلك تعمل تعمل branching وبعد ما
أخلص أروح باتجاه ال application تابع عشان أنهي
تمام؟ وبالتالي الآن بداية ال thread هان هتكون من
خلال ال run method زي ما هنشوف الآن في ال
implementationبعد هيك في عندى method في ال class
thread اسمها run static method اسمها run وانا من
خلال ال run هى اللى بتروحاش او عفوا start بروح
بتعمل call لمين لل run method ل start يعني أنا
بكتبله thread.start بروح بعمل run او بعمل calling
لل run method تعالى نشوف بعض ال code البسيط اللى
عندهاهذا الكود الأول أنا عملت implement لمين أو
extend لمين لل thread class extend لل thread class
هاي ال constructor تبقى لل thread ومديها integer
سمي sleep جولنا في داخل ال extent لازم اعمل
implement لميثود اسمها runفى داخل الـ run super
.run for الواحد لمية او من الصفر لمية system.print
this.get name مين ال this؟ على مين بتعود ال this؟
على ال my thread ال this بتعود على ال my thread
اللى موجود عندها لأن المفروض ال this بترجع لمين؟ ل
object صح؟ مين ال object اللى موجود فى داخله؟my
thread وهي تقولها الـ constructor اطبعلي اسم ال
thread اللي موجود عندها و ال counter تبعت ال I و
اعمل sleep بمقدار فترة زمنية اللي انا ممررها طيب
الان هذا ال code بس عشان اورجيكيأثناء الـ Runtime
انه فعليا مرة هيطبع المعالج من ال thread واحد و
اتنين و تلاتة واحد و اتنين و تلاتة واحد و تلاتة و
اتنين و تلاتة واحد و اتنين فكل مرة هتحسي عملية
الطباعة عشان ايه قلتله اديني اسم ال thread تمام؟ و
ال value تبعت ال I بس عشان يكون مثال سهل الاصل ال
code مش هيك يكونالأن في داخل الـ run بدي أقرأ ملف
مثلا بدي أحقق بالكون تبع قرأتي الملف اللي هان بدي
أحسب ال .. ال average لقراع حجمها مائة مليون
element بدي أبدأ إيش في عملية execution هان طيب ال
implementation التاني بود أعمل implement لمين أو
الكود التاني أعمل implement لل runnable interface
implement
ل runnableconstructor تبع my runable هي نفس الكلام
مررتله sleep وروحت في ال run implementation كتبت
نفس ال code السابق print من ال runable وروحت بعمل
sleep المفروض هنعتمد على ال sleep بهمش بس في خطأ
بسيط في ال code على ال sleep ولا حاجة افرج غير انه
God extend
extend thread أو implement runnable طيب في داخل
برنامجي الأساسي اللي هو الجزئية الأولى رقم واحد
هذه ال class اللي بده اعتمد عليه شغلهم تعالى نشوف
أخد object من مادة thread سميته T1 و ادته time
waiting تبعته 102 ثم رحت على T1 قلت له set name T1
خلّينا من ال priority هاي، هتتكلم عليها كمان شوية
My thread took .. أخدت object تاني و اديته كمان
100 miliseconds و
اديته اسم تعالى نشوف لما كيف استخدام ال runnable
بنفعش أروح أخد object .. أخد object من مين؟من الـ
my runnable اللي هو عامل implementation لمن؟ للـ
interface فهو هتعرفي ال thread T3 من ال super
class و اديته ال constructor object من ال class
اللي عامل implementation لل runnable تبعتي عشان
يكون فيه زيك داخله إمكانية ال run لأن ال runnable
هذا لوحده لو احنا رجعنا الفرق super ده ت run ال
super مين؟الـ thread بس في ال implementation مش
موجودة للرنبل مش موجودة طب عشان انا اخلي ممكنية
انه يتنفذ لازم اخد الرنبل هذا و اديه لمين ل thread
لازم اديله او اديه ل thread طيب
مش اللي صار هنا طيب تمام يعني انا فعليا كم object
او كم thread صار عندي T1T2 تلاتة هذا ال code من
هنا لهك او لا بلاش هيك sequential code اللي هو مثل
الرقم واحد هنا طيب الان تعالى نشوف T1.start ال
method start اللي موجودة في ال run او في ال ..مع
الـ thread قولّي أيش بتساوي؟ بتستدعي ال run method
اللي موجودة في ال class اللي موجود أو مرتبط بال
thread تمام فهذه هتروح تستدعي ال run تبع ال T1
ومجرد تعمللها calling هتنتقل مباشرة لل next step
مش هتستنى مش هتستنى هتنتقل لمين؟وبالتالي عملية الـ
Branching بدأت تتفرق الآن الفرق الزمني بين T1
.start وT2.start كم؟ تقريباً نانو ثانية نانو ثانية
لأن هذه single task للـ CPU وبالتالي الفرق ما بين
ال task والتانية نانو ثانية وبالتالي هنا يكاد يكون
Zeroتانية الفرق ما بين هذه وهذه وبالتالي شغل
الأولى والتانية والتالتة وال applications ال
different threads التلاتة اللي عندي هذا
بيعمل wait كل جملة طباعة بيعمل sleep أو بيعمل wait
بمقدار عشر ثانية بينما ال runnable اللي هو ال test
التلاتة بيعمل wait بمقدار جديشعشرين ثانية وبالتالي
لما تشوف ال execution تبع الكود هذا هتشوف
different output مرة بكتب لك thread واحد أو thread
اتنين او rarible الى اخرها الان اللي انا بدي اقوله
هنا هذه الجزئية لو كان في وراها كمان code هيكمل مش
هيعمل wait لأي اشي و هي miss ال thread لحظي مع كل
threadالان ال system هذا في two أو three branches
تلت تفرعات و كلها بدت تشتغل بشكل متزامن حسب
ال code هذا اه بطبع و بروح بعمل sleep بطبع و بروح
sleep اه انت بتحددي في وين ما بدك انا ليش بعمل
sleep هنا لأنه في لحظة من اللحظات مش هشوف الفرق
الزمنيما بين كل جملة الطباعة والتانية فانا لما انا
بعمل sleep بقولوا لأ استنى شوية ماتطبعش ليش؟ عشان
اوديكي .. اوديكي الطباعة انه لأ انا ممكن اتحكم ..
فال sleep هاد ايش هي؟ هي عبارة عن time waiting
state time waiting يعني انا هو هان بعمل run في
المرحلة هذه روحتي عملتله time waitingدخلته في
الستيطن اسمه الـ Time Waiting لما خلص ال loop راح
على terminated انتهى أمره هل أجيت بتتكلم فيها؟
الآن اللي احنا حكينا عليه ان ال Java virtual
machine هتعمل تبعت لل operating system حسب ال
application اللي عندنا هنا ان انا فيه عندي three
جديش three different tasks جديدةوهيروح الـ
dispatcher يقول لـ scheduler نظّم كمان الوجهة
للتلت task هدول و هيبدأ ال execution الآن ال
execution المعالج يخلص مين جاب لمين مافيش ضامن لأن
هذا شغل لمين؟ لل CP و لوحده لل operating system
لكن الجابة قالوا احنا ممكن نتحكم في الموضوع بحيث
انه نتكلم على الأولوياتالـ Priority مع الـ threads
من واحد لعشرة ال minimum priority واحد و ال
maximum priority عشرة أو ممكن أكون عكستها
بالمناسبة، لأ مصبوط عشرة الفكرة وين؟ انه with
maximum priority أنه أدي الأولوية لل task هذا وهذا
مفهومها أنه أنا بضحي بال run تبع ال threads
التانية بحيث أنه هذا يشتغليعني لو هذا طلب resource
تعمله .. يعني حرر ال resource و تديه أولوية ان هو
يشتغل تماما تماما زي ما تكون واقف مثلا في طابور و
يدي شخص صاحب أهمية و بيعرف الموظف اللي موجود بباشر
بقوله تعال عندي هان تديه أولوية عشان يعمل
execution بس عشان اكون صريح ومنصف كمان حتى هاي ما
بتضمن ال execution 100% بالجامعةيعني انا شغال ..
حتى لو رجعت لل document الخاص بال thread و ال
priority على موقع ال Oracle هتلاقي الكتبلك انه على
الرغم انه هذه معمولة عشان تعمل هيك انه مافيش
guarantee انها تتنفذ عشان هيك انا بقول مافيش
guarantee مين يخلص قبل التاني مافيش guarantee مين
يخلص قبل التاني طب انا ايش ممكن استفيد من ال run
هذه او من .. لو تحققت ال priority معناته انا بصير
اقدر ارتبTask تبعتي مين يشتغل جابل التاني و بضمن
دي بندنس يسيبيكي من الجوال و يخليكي معايا طيب،
الآن بدأنا في execution لل thread و ال three
threads بيشتغلوا مع بعض تخيلي أنه لو التلاتة
threads هدول بدهم يقرؤوا نفس الملف أو بدهم يكتبوا
على نفس الملف، إيش المفروض اللي يصير؟ تلاتة يكتبوا
على نفس الملف في نفس الوجه، معناته مشكلةعشان انا
بصير انا لازم اعمل block لل resource من اللي بده
يعمل ال block انت ك programmer انت ك programmer
لازم تحددي متى انا بدي اعمل ال block و ايش هو ال
resource اللي انا بدي اعمل عليه ال block اعملي
صامت يا أستاذ طيب
الان الملف هذا اللي بده يعمله block عشان اطبق ال
block أثناء ال run لل thread في عندى مصطلح اسمه ال
synchronizationوهدفه الأساسي أنه أمنع ال thread
interference مايصيرش فيه تداخل أو تشويش في عمل ال
threads على بعضهم أو أحل مشكلة ال consistency،
مصبوط؟ احنا لما اتكلمنا على ال database، قلنا في
ال database مهم جدا عملية ال lock على ال resource
عشان يحافظ على ال data consistency وضربنا المثال
تبع ال bank، مصبوط؟وها نفس الكلام بالتالي ال
resource موجود عشان انا احافظ على ال consistency
وماصيرش فيه عندي مشكلة في البيانات لازم اعمل look
ال look بتم من خلال مصطلح اسمه synchronized على ال
shared resource ايش ال shared resource ممكن يكون
ال array وخلينا نرجع فيكي خطوطين للخلف على ال
collections لما قلنا ايش الفرج بين ال array list و
ال vectorيعني ال vector هو عبارة عن object
synchronized ايش يعني بقدر اعمل عليه lock لما حد
يعمله access وقلتلك في يومها لما نصل لموضوع ال
thread نتكلم عليها مرة تانية يعني ممكن يكون في
عندي vector او array بين جسيم ممكن يكون عندي data
fileمصبوط؟ ممكن يكون عندى string معين انا بديه او
object معين انا بديش اعدل على ال content سبعته لحد
ما انا اخلص بعدهم هيك بعد هيك يغيروا اللي بدهم هيك
عشان احقق ال synchronization ممكن اشغلها على تلت
مستويات مختلفة أهمهم الأولى والتانية في عندى
synchronized method وفي عندى synchronizedالـ block
Synchronized method Synchronized block يعني أنا
الأن المفروض أجي هيك في داخل ال run تبعتي في داخل
ال run أو في داخل ال code هذا على سبيل المثال بدي
أستدعي ده method اسمها get data ومزودها
ب file object
بدي أقرأ الـ data اللي موجودة في الملف أو بدي أكتب
عليها خلّيكي أهم الان الـ synchronized method
بمجرد أني أعمل call للميثود اللي اسمها get data
تعمل block لل code تبعها طيب ما هو .. انتبه شوية
احنا عاملا حطينا ال call تبعتها هنا يعني كل
threads أو كل thread هتقرأهاممتازة أول واحد بدأ
فيها execution هيوقف البجي يقولهم واجفه لاحدش
يستخدم ال function هذه أو بين جثين ال resources
اللي بتعتمد عليها ال function هذه لحد ما أنا أخلص
لحد ما أخلص مين؟ لحد أخلص execution من ال function
من بدايتها لنهيتها وبالتالي ال synchronized method
بمجرد إن عملها invocation من أول سطر لحد ال N
تبعتهابتحط الـ block بتحط ال resource بتحط ال
threads التانية في وضع blocked طيب طب انا فعليا
ممكن انا محتاج المكان اللي انا بده اكتب فيه هم
سطرين في داخل ال method وانا بده اعمل block حين ما
بده اكتبليش أعمل block على كل الملف طالما في ناس
بتقرأ أو ما شابه؟ ليش ما أعمل block بس على الجزئية
اللي أنا بدي إياها؟ وبهيك بنتقل للجزئية التانية أو
للنوع التاني Synchronized Block يعني أنا الآن بدل
ما أعمل إغلاق بمجرد أعمل calling لل method من
بدايتها إلى نهايتها لأ بدي أروح على specific lines
of code و أقول هدول هم اللي بدوني أعملهم إيش؟ ال
blockingعبر المثال التالي نفس الـ function نفس الـ
function بس لاحظت الـ synchronize وين نجلتها؟ في
داخل الـ method هيا يعني لو في code هنا
هيكمل .. هيكمل و بمجرد يصل للـ end هذه هيعمل
release لل resource اللي موجود عندى .. لل object
اللي موجود عندى هنا و من ثم ال object التانية او
عفوا ال thread التانية بتقدر تصل لل object اللي
موجود عندى بشكل كويس طيب لأن مين احسن اذا انا
بتكلم
الـ Synchronized method more restricted يعني
بتحافظ على data consistency أعلى مصبوط لكن
Synchronized block fair أكتر فيها عدل أكتر ليش أنا
موقف كل الشغل بينما انا بدي سطر او اتنين فانت اللي
بتقدر او ال system analyst هو اللي بقدر وين او متى
انا بدي اعمل ال block يعني اذا كان كمان مرة ال
block على سطر جزئية الكتابة لأ والله انا بفضل اروح
باتجاه ال Synchronizedالنوع التالت الصحيح أنا
ماجتهش مثال أقدر أوضحه فيه بشكل واضح اللي هو بيسمي
static synchronization وهذا المفهوم static
synchronization أن أروح على واحدة من ال method في
ال class و أعرفها as synchronizedبمجرد ان اعرف هذه
ال method Synchronize و كأن بصير بقى اعمل look على
ال class كله و كل ال object يعني وين في عندي
object او resources موجودة مع ال class هذا بدي
اعمل عليها look لحد ما انا ايش اخلص و الباقي
يدخلوا في مرحلة ال waiting الفكرة فيها ان لو T1 و
T2 بتشاركوا object 1 و هدول جايين من نفس ال class
بالمناسبة من نفس ال classو thread 3 و thread 4
بيشتغلوا على object 2 بالمبدأ البسيط هنا .. مافيش
.. هنا في synchronization ما بين الاتنين او مافيش
interference لكن ممكن يصير في interference بين
واحد و تلاتة او اربعة او بين اتنين و تلاتة او
اربعة، بصبوت؟ لأن عشان أحل هيك شغلة بدي ألجأ
لموضوع ال static synchronize بروح على ال class هذا
بشوف واحدة من ال static method اللي موجودة فيه و
بعرفها asSynchronized Public Synchronized Static
الـ return data تبعتها واسمها فبصير ال class كلها
تكون Synchronized بمجرد أن ال thread يعمل access
على أول object كل ال resources المرتبطة بال class
سواء كانت مع ال object هذا أو غيرها تدخل في مرحلةa
block و ال thread اتنين او تلاتة او اربعة بدخلوا
في مرحلة ال waiting لحد ما يخلص T1 يعمل release
بيصيروا هدول بيحاولوا يصلوا لل objects اللي موجودة
عندهم لكن زي ما قلتلك فعليا ما لجت مثال يوضح اهمية
ال aesthetic synchronization و متى او وين اقدر
انفذهاباستثناء انه و الله انا عشان احل مشكلة ال
interference اللي ممكن تصير عندها اليوم نكتفي لحد
الجزئية هاي ان شاء الله تعالى و المرة الجاية
بنتكلم على ال threads ball و ال executors عشان
ننتقل لمرحلة جديدة في التعامل مع ال threads في اي
سؤال يا بنات؟ الله يعطيكوا العافية