بسم الله الرحمن الرحيم الصلاة والسلام علي رسول
الله اليوم ان شاء الله هنكمل في موضوع ال thread ..
ال multi-threading و هنحاول نجمل الكلام اللي احنا
قلناه المحاضرة الماضية قلت سابقا كل برامجنا بال
Java لحد اللحظة .. لحد المحاضرة الماضية كانت
بتشتغل على single process أو single task أو حتى لو
كان في عندي multi-task فكانت execution تبعهم بتنهي
بشكل sequentialمع إنه المعالجات عندها قدرة عالية
إنها تشغل بأكتر أو تشغل بشكل parallel واتفقنا إنه
في عندي أنا process-based multitasking وفي عندي
thread-based multitasking لـ process-based قلنا
شغل ال operating system إنه يشغل أكتر من
application مع بعض وقلنا لـ thread-based شغل ال
application الواحد إنه يشغل أكتر من task بشكل
متزامنوبعدين نتكلم عن الـ Multithreading بالجاوة
نقول ان ال thread بشكل عام يعني أنا الآن بشتغل في
ال application تبعي بدون عمل branching حسب عدد ال
branches اللي ممكن تكون عندي و بعد هيك شغل كله
يتجمع مرة تانية يعني أنا فعليا جزء ال parallel او
ال concurrent بيكون في جزء من البرنامج وهذا
التقسيمة بدها تكون حسب ما انا جديش فاهم البرنامج
تبعيجديش الـdependency أو الـindependence الـ
independent parts موجودة في ال application تبعي
عشان أقدر أدي كل part ل thread معين وقولنا بشكل
عام ال thread لما أنا أنشئه يلو مجموعة من ال
states أو ال thread حياته بتدخل مجموعة من ال
states new, runnable, blocked, waiting, time
waiting و terminatedالـ new أنا أنشأته، بعدين
بنتقل لمرحلة تانية اللي بيناعمله run، execution،
blocked أثناء ال execution، بده resource، لكن ال
resource ده محجوز، هيعمل wait، الآن waiting هو
جاعد بيستنى task أو بيستنى result من ال thread
تاني إنها تجهزت، terminated و time waiting، أنا
عامله sleep، يستنى فترة زمنية محددة، ثم يشتغل
عليها و ال estate الأخيرة اللي بيسميها terminated
لما بينتهيوكنت عشان أنشئ الـ thread بالـ Java و
بالـ code تبعي عندي حالتين إما بدي أعمل extend للـ
thread class يعني بدي أتورث خصائص من ال thread
class أو بدي أعمل implement للـ runable interface
طب، هل في أفضلية لاتنتين؟ هادي ولا هادي؟ مابتفرجش
كتير معايا بس بيحكمني في الاستخدام .. عفوا موضوع
ال inheritance اللي اتعلمناه في ال object oriented
أنا لما بكون في عندي class و عامل extend من super
class زي ال employee أو ال student أو ال vehicle
إلى آخره أنا ماقدرش أروح أقوله كمان مرة extend
threadsلكن بروح بقدر اقول له implement runnable
فالان حسب الشغل او الاتجاه اللي انا بدي اشتغل فيه
حسب وضع ال application او ال application اللي انا
اعمل ال application اللي انا بقى اشتغل فيه وقولنا
في كل الحالتين بدي اعمل override او بدي اعمل
implementation للميثود اللي اسمها run هذا ال
example بشكل سريع اللي احنا شوفناه extends thread
الـ run طبعاً تبهي ال data type تبعتها void يعني
مافي return data وهي ال execution تبعتها عشان اعمل
time waiting sleep هيها لو انا بدروح اعمل
implement لل runnable نفس ال code run و برضه void
و نفس ال code السابق بدون اي مشاكل في داخل ال main
application تبعي اللي من البدايةmy thread واقتي
واحد my thread و اديته الزمن و اديته اسم و حددته
priority my thread اتنين و اديته زمن و اديته اسم و
حددته priority thread تلاتة و هان ضروري ان تنتبه
ان انا رجعت لل super class thread بينما هان كنت
بتعامل مع ال my thread اللي انا عملتله extend و
العلاقة بينهم is A طيب و روحت في الآخرة ايش قلتله
هان ال new thread و اديتهobject mail الـ my
runnable اللي انا اشتغلت عليه تمام وقلنا start
بتستدعي ال run method في كل واحد منهم و بمجرد انها
تبدأ الشغل تنتقلاش على اللي بعدها مابتستناش تخلص
وبهيك صار في عندي انا multi-threading اشتغل في ال
application تبعي وقلنا كلام مهم جدا ان ماحدش بيضمن
كيف شكل ال outputليش؟ لأن كل هذا بيعتمد على ال CPU
ال CPU scheduler و dispatcher جداش في عنده task
جداش ال CPU busy جداش idol فبروح بصير يعطي أو يجسم
الأوقات اللي موجودة عندنا أهم وقلنا بعد هيك أو
انتقلنا في نهاية المحاضرة اتكلمنا على شغل يسميناها
ال synchronization أو ال look على ال resources
اللي موجودة في داخل ال application تبعي يعني لو
كان في عندي data fileملف بدي أقرأ منه أو بدي أكتب
عليه إذا أنا بتكلم قراءة أو كتابة عملية القراءة
مافيش فيها مشكلة مابتستدعيش إنه هقنع مالك لأنه
أكتر من user ممكن يقرأ من نفس الملف بدون مشكلة لكن
المشكلة بتصير واضحة متى عند الكتابة إذا أنا بدي
أكتب على الملف فلازم أنا أغلق الملف ال thread على
فرض إنه أنا فيه عندي T1و T2 و T3 دول الـ different
threads و بدهم يصلوا للملف هذا عشان يكتبوا عليه
طبعا أثناء ال execution فيه فرق زمني ما بينهم
مصبوط الآن T3 وصل لمرحلة
قراءة الملف جبلالان بدنا نعمل lock لل file ال file
هذا ممكن يكون ال realist ممكن يكون ال vector ممكن
يكون اي شغل تانية اي object تاني موجود عندى فانا
بدروح اعمله lock ال lock كان معناته اتنين هدول هذا
لسه ماوصلش هذا وصل هيدخل في مرحلة blocked مغلق مش
هيقدر يشتغل ليش لأن ال resource اللى بدهمشغول أو
محجوز من خلال T1 أو T3 خلص T3 وحده هيدا بيكون وصل
الان واحد منهم فمجرد هدي يعمل release واحد منهم
هيمسك ال resource هيعمل lock والتاني هيدخل في
مرحلة ال blocked عشان أنفذ عملية ال blocked هذه في
عندي تلت حالات إما بروح باتجاه ال synchronized
methodو بالـ Synchronized method أنا بده أروح
أستخدم الـ keyword الـ keyword الموجود عندي
Synchronized في الـ definition تبعت الميثود أنا
بدي أقرأ ملف أو بدي أكتب على ملف الميثود هذه بروح
بعرفها public Synchronized public Synchronized
لاحظوا الميثود هذه مش static public Synchronized
مفهوم كلمة Synchronized هي موضوع الـ look أنه لازم
يكون فيه تزامن في التعامل مع الميثود هذه أطبقوا
Synchronized مفهومها Synchronized method بمجرد أن
ال thread الأول يعمل call لل method هذه ال method
هذه بيعملها look للكود اللي جاي نتبهي معايا لهذا
الشغل الآن هذا الكلام مهم بدي أرجع معاكي للمثال
السابق و أخلي ال function هذه حاضرة في ذهنك الآن
لو أنا جيت كتابة getdata file أو get data from
file اللي هي ال method تبعتنا ال execution هو
sequential ولا؟ تمام يعني هيبدأ ينفذ هنا هييجي على
ال method وينتقل جوا ال method sequential لما يخلص
يكمل اللي بعدها، بصبت؟ طيب ما هو ال code هذا مشترك
بين T1 وT2 وT3
T1 أو T3 عفوا وصل جابلهم وصل لـ method هان بمجرد
عمل call لـ method الان شخص ساوية بيمنع أي thread
يكمل execution هذه مفهومها يكمل execution على
الكود اللي جاي لأن كله بيمر بنفس المرحلة فهذا من
هان من بداية ال calling لـ method هذه حتى نهايتها
ال function هذه إيش locked يعني كلالـ threads اللي
بيمشوا وراه جاعدين أو متأخرين عنه شوية في ال
execution لما يصل المرحلة هذه هيجفوا لحد ما ..
يصيروا blocked لحد ما هذا يعمل release وبالتالي
متى بيخلص؟ لما يعمل return لل value المطلوب عنده
لحد ما يخلص كل ال functionفيها ميزة كويسة إنها
بتحافظ على الشغل كله consistent من أول الـ
function لأخريتها أنا ضامن إنه مافيش حد بيعمل
interference على الشغل اللي عندي ك thread لكن بعضه
فيها عيب طب لربما السطر أو الجزئية اللي أنا بدي
أكتب فيها سطر واحد موجود هان أعمل
wait لحد ما تخلص ال function أو أحط ل threads
التانية لحد ما تخلص ال function كل الفترة الطويلة
عادي طب ماما بروحبعمل block على قدر الجزئية اللي
أنا بدي إياها وبهيك بوفر وجد على ال threads
التانين بيبدوا يعملوا execution في ال method لحد
ما يصلوا الجزئية المحددة ال specific بيجفوا وبهيك
بصير في عندي أفضلية أو أديت وجد أو جلالة وجد
الانتظار أو وجد لمن؟ لل threads التانين واستفدت
بشكل أكبر مين اللي بيقرر أروح باتجاه synchronized
method ولا synchronized block؟أنت كـ Programmer أو
System Analyst اللي هو بيحدد الفقرة وين أنا بدي
أضيفهم Synchronized Block هي جزء من الـ Function
مش بالضرورة يكون كل الـ Function Synchronizedطبعا
هذه الـ method أنا في داخل الـ method بعرف الـ
synchronize مثلًا مثل الـ try و بحدد له ال object
اللي المفروض ايش بدي اعمل عليه انا بدي اعمل عليه
blocked و كل ال code اللي بدي نعمل عليه blocked
يكون في داخل ال curly braces الخاصة بمين بال
synchronize تبعتنا يعني هذا ال code هيكحسب المثال
هذا هينعمله closed block يعني فعليا أي thread
هيدخل و ال code اللي جاب لهذا هينفذه لحد ما يصل
لمين لـ synchronized block و قولنا الحالة التالتة
اللي عندنا static synchronization ان اعرف static
method تمام؟ في ال class اللي عندى as synchronized
يعني حصي في تعريفها publicstatic-synchronized
public-synchronized static والـ data type تبعتها
صار في عندي four modifiers موجودين من ال method
الآن إذا أنا عرفت ال method static عرفتها
synchronized مفهومها بمجرد أي object بغض النظر هل
ال object هذا common مع ال threads ولا different
threads يشتغلوا عليه بمجرد ينعمل كل ال method هذه
كل الـ objects اللي معمولة على ال class كل ال
instances اللي مبنية على ال class بنعملها Blocked
ماحدش مابدأ يشتغل، خلصنا طب هذا و هذا two
different المفروض هدول التانين جايين من نفس ال
class هدول different classes الحل خلاص انت معرف ال
method اللي عندنا هنا Synchronize او Static
Synchronization Synchronize Static Method معناته
انت هتعمل لكطيب و بهك كنا نهينا موضوع المحاضرة
الماضية كلها يا كما الان اللي ضايل عنا شغلة او
تنتين مهمات جدا فى موضوع ال threads عشان السبت
نشتغل عمله ان شاء الله تعالى الان فى
ال code هذا
T1, T2, T3, T4 طب لو أنا بدي أكتر من هيك بدي كله
مكتوب بالشكل هذا بيبقى اللي عارف فيهم؟ هل منطق؟ لأ
طب بدي أحطهم جوا loop بنفع أحط الصدر هذا جوا loop
من خمس iterations؟
لأ لأن كل مرة بينشي object يجيب بنفس الإسم كل مرة
بينشي object يجيب بنفس الإسم وبالتالي مش منطقية
الشغل هيكفلما بدوا يتفكروا في الـ Multithreading
لك ممكن انا اشتغل على شغلة اسمها thread pool pool
اللي هي المسبح او البركة تمام؟ و لما اتكلم على
thread pool يعني انا بتكلم عندي على مجموعة من ال
threads انا بانشئها دفعة واحدة بانشئها دفعة واحدة
الان thread pool is an instance of executor
serviceوهذا ال class هو اللي هنعتمد عليه في إنشاء
ال threads لاحقا تمام ال executor services هذا
بنشئ ليه خمس أنواع مختلفة من ال threads الأول
single thread executor من خلال ال executors.new
single executor يعني بنشئ انا ايش؟ thread واحد فقط
Cached Thread Ball ايش مفهوم الـ Cache؟ ان يكون
فيه عندى شغلاء جاهزة، مظبوط؟ انه فيه اشي جاهز
للاستخدام، مايروحش ينشقلي ايام جديدة لما انا بروح
بقوله Cached Thread Ball ال scooter هذا هيروح
ينشقلي مجموعة من ال threads انا بحدد عددهم وليكن
خمسة على سبيل المثال الخمسة هدول اذا انا ما
استغلتهمتمام؟ ضمن فترة معينة اللي هي سبتين second
هيروحوا الخنسة على ال terminated state ايش يعني
هيسرلهم؟ هيعملهم kill، هيموتهم، يحذفهم بمعنى آخر
يعني ممكن أنا أروح أنشق cashed thread pool من عشرة
thread و أبدأ عنده في الشغل تبعي خلال أول سبتين
ثانية استغلت فقط منهم أربعةالست التانية حينعملهم
كل ميزة وعيب في نفس الوجد ميزة ان انا بحافظ على ال
CPU تبعي و وضع ال state نيحة بحيث انه مابستغلغش او
مابحجزش وجد او space في ال memory بدون فايدة هذه
الميزة العيب ان هذا بفرض عليا challenge انا ك
developer ان اعرف فقط thread على حسبحاجتي على حسب
حاجتي النوع التالت fixed thread pool ال fixed
thread pool انا بنشي عدد طبعا الان fixed على خلافي
cash بنشي عدد ثابت خمسة عشرة استغلت منهم تلاتة
الباقي بيبقى اللي موجود هكذا انت حاجزت CPU وTime و
memory space بدون usageوبالتالي في الـ Fixed
Thread Pool انا بحدد العدد اللي انا بديه عيبها ان
لو انا احتجت اكبر من العدد ماقدرش أسوي حاجة ولو
احتجت اقل بكون في عندي waste في ال time Schedule
Thread Pool Schedule يعني انا بدي ال threads هتتم
إنشاءها عند فترة زمنية محددة تبع الجدول محددSingle
Thread Scheduled Pool Thread واحد لكنه يكون
Scheduled هنا نتكلم عن مجموعة وهنا نتكلم عن one
thread تعالى نشوف بالمثال ايش اللى هيفرق عن الكود
السابق روحك
بالمثال اللى عندنا هنا ومثال بسيط Executer
Service
executors.new fixed thread pool يعني أنا روح
بالاتجاه النوع التالت fixed
thread pool معناته أنا بديش fixed number of
threads و هيكون هدول موجودين لل task اللي بقى أنا
بدي أشتغل عليها الآن ايش قلتله؟ جديش العدد؟ تلاتي
يعني أنا بس بدي ال pool تبعتي مكونة من three
threads4 الـ I من واحد لخمسة هاي صار في عندي loop
في داخل ال loop أخدت counter سميته count وعطيته
قيمة ال I ويعني واحد، اتنين، تلاتة، اربعة، خمسة كل
مرة هيتغير ووراها مباشرة ال S اللي هي ال executor
service هاي dot execute أيوة
Execute هذه بتعمل creation أو بتعمل .. بتدّي ال
task لل thread يعني بتنشي ال thread و بتدّي إيش ال
task قبعته طيب إيش ال new runnable هذه؟
هي ال interface اللي احنا شفناها قبل هيك سابقاً بس
الآن هذه anonymous في المثال السابق object name
ديناها اسملما انا روحت عملت الـ implement للـ
runnable تمام؟ ال class تبعي my runnable أخدت منه
object هنا thread new my runnable بإمكاني كنت
أستغنى عنها و مباشرة أقوله new runnable تمام؟
و من ثم أنا بروح على object جديد أتعامل معاه و
سمنا احنا anonymous object تمام؟الان صار فى عندي
anonymous runnable صار
فى عندي runnable object بدون اسم انا بطلت يهمني
اجددش عدد مجرد احق العدد هان وانشي اللى بدك ياه من
ال runnable طيب لحتى الان الكلام generalفي داخل
الـ code هي implementation للـ run method اللي
احنا شوفناها سابقا اللي هي عند ال start بتتم عليها
الشغل مباشرة وال execute هتوجه ال run hand مباشرة
في داخلها كنت بعمل جملة اقطباعة او باطبع في لوبة
بتعمل جملة اقطباعة فقط thread text ال count اللي
انا عرفته فوق writes كتب وقيمة ال value تبع ال J
اللي هي من واحد لعشرة ووراها بيعمل sleep بمقدار100
ملي ساكند تمام بس خلصت ال definition تبعت ال
execute حيطلع error ليش؟ ايه؟ لأ هو ال error لإنه
هذه هيك لازم تكون .. اه هي موجودة بس أنا مضيع ال
ghost في ghost اه في ghost لازم تكون هنا طيب لأ مش
هيطلع error لأ لأ هذا تبعت ال mainالـ four لأن
هناك جملة تانية و هم اللي ورا الـ four فهي الناس
اللي جوز اكتبهم الآن مش هيطلع error الـ ball اللي
أنا أنشأت ساعته كام thread؟ تلاتة ثم ال task اللي
عندي لخمسة ايش هيساوي التنين ال two task التانيات
اللي أنشأليهم ال executorتمام؟ يعني هو الآن اللوب
هتشتغل هتشتغل هتنفذ الخمس مرات في كل مرة كانت
بتروح تحط للرنبل في مين؟ في الـ ball حطت الأول
والتاني والتالت الآن صار ال ball full انت لأ بصبوط
ساعته تلاتة راحت كمان مرة عملت generate للرابع طب
مافيش الوسع نحط في ال ball بنحط في Q في الامتدار
مجرد أن أول واحد منهم يخلصبدخل الرابع وين؟ على الـ
ball والخامس وراه وهكذا هذه ميزة ال ball دائما انا
بحدد عدد معين طبعا ليش العدد هدا؟ ليش انا محتاج ال
ball؟ اولا لان انا ممكن احتاج عدد ال threadsأكتر
من أني أروح أعرفهم الـ Static Threads في داخل ال
application تبعي صار في عيني الـ General
Definition للـ Thread هذه واحد اتنين لازم أحافظ
على قدرة المعالج اللي موجود عندها و أشغل ضمن قدرته
مر عليك أي application بدون ما يسألك أو يكون محدد
ال minimum requirement سواء نزلتي office و لا
operating systemولا براوزر ولا أي حد ولا حتى IDE
للبرمجة كل system مش ممكن تكتبليك ال minimum
requirement لل system هذا ان يكون المعالج كذا ال
memory كذا و ال space كذا هذا نفس الكلام بدي
اقراعيه انا هان لما اشتغل في ال application بشكل
عام طيب هذا البرنامج او التوجه هذا توجه عام انت
قاعد يا دكتورة بتطبع لنا جملة طباعة هانو بس، إيش
أنا المفروض أساوي؟ تخيل إيه إنه الآن أنت عندك
array من 100 ألف element integer مليون
element، مش هخسر ولا حاجة أنا أكيد في
عندي array حجمها مليون element integer وبتدرح أجيب
ال average تبعتهاماذا أفعل؟ إذا كنت تعمل على خطوة
واحدة يعني أنك تقول له هتاخد وجهة طيب ممكن انا
أروح أجسمهم على خمس خطوات انا بدي أحطك في صورة كيف
ممكن انا بدي أشتغل هنا طبعا في البداية هي القرية
تبعتي ال integer x
new integer
بغض النظر عن الـ syntax وكيف بدي أعملها
initialization زي ما بدك تسميها صارت الـ array
عندي جزء من ال application ال array جزء من ال
application و أروحنا أحنا ال array جزء من ال
application في داخل ال run هنا أنا عامل حسابي بدي
أعدل ال application تبعي هنا ل five threads عشان
كلهم يشتغلوا إيش بتتوقعي ممكن أسوي أنا؟ بدي أكتب
codeبدأ أجسم حجم الـ R على كل thread يعني الأول
يعني بالذنب أعمل switch case بالمناسبة مصبوط أو
بالذنب دائما أعمل iterator عشان أو عفوا counter
عشان أعرف من وين بدي يبدأ لما تكون ال I equal واحد
بدي أبدأ من وين ال thread الأول بدي أبدأ من صفر اه
يعني هدول مليون او مائة ألف مليون يعني بتكلم على
مائتين ألف مصبوط نصيب كل واحد فيهم من واحدلـ
199999 من صفر لـ 199999 هذا نصيب ال thread الأول
التاني يدرس ال counter اللي يبدأ فيه لما يشتغل
معلوق هي نفس القرية الموجودة عند التنين تمام؟
والتالت والرابع والخامس معناته أنا بلزم نهار اما
اعمل F statement او switch يعني switch لل count لل
count عشان احددجوا كل case من أين .. على الأقل الـ
pointer تبعها من أين بده يبدأ وبعد ال switch case
هذه ببدأ أروح أقوله أعمل summation هيك بده يبدأ
البرنامج تبعي يعني هيك، حرج أقوله مثلا switch ال
count case
1 ال index يساوي 0 ال index يساوي 0 وهي breakخلصنا
لو كانت ال case 2 ال index يساوي 200000 مصبوط و
التالتة و لما في الآخر بخلص هروح أقول له ال sum
equals 0 for عمّال iteration الآن من أين بدأت
تبدأي؟ من عند ال index ال integer I equal ال index
إلى
الـ maximum value اللي هتضيف عليهم الـ 200 ألف
التانيات نصيبه لحد آخر واحد ال sum plus ال S plus
equal ال array اللي هي X سميناها God of I وبعد هيك
بتروح ال A بتحسبيه لل average
لأ لأ for loop واحدة ليش تكتب اكتر من for loop انت
ال case بس عشان ياخد مين ياخد ال index و الآن بعد
هيك يبدأ كل loop بتبدأ من وين بناء على قيمة ال
index انت بحاجة ل code واحد لمرة واحدة هذا الكلام
انت اللي لازم تبدأ تفكر فيه لأنه حسب طبيعة ال
application هي اللي بتفرض عليكي مثلا انا في عندي
والله عشر ملفات أحجامهم مختلفة وكل مرة بدأ اقرأ
ملف مختلف تمام؟طب انا اخلهم ال thread واحد اللي
يقرأهم ولا اعمل عشرة thread كلهم يوم و كل واحد
يقرأ ملف عشرة thread ممكن ماصيرش بحاجة لأ ان اعمل
loop تمام؟ بس اعيد ضبط تسمية ال .. او ممكن اعمل ال
loop نفسها و اعيد ضبط اسم الملف و اضيف عليه الرقم
بس تبع ال index عشان اظل ماشية فانت كيف بدي تكون
البرنامج غير الصورة التقليدية او البسيطة اللي احنا
بنحن نوصلك الفكرة فيها؟هتكون الأمور تمام طيب نرجع
لمثالنا هذا عشان نكمل في مثالنا هذا ايش اللي
هيقبع؟ هيكتب ل thread ال count مثلا واحد write
واحد الان مش ضروري مباشرة اكتب ل thread واحد write
اتنين ويمكن يكتبها ممكنلكن بعدها هتلاقي thread 2
write 1 thread 3 write 1 thread 1 write 3 thread 2
write 4 write 5 و هكذا لكن اللي هتشوفيهم هان واحد
و اتنين و تلاتة فقط لمتى لحد ما تخلص ال loop هذه
بيكون واحد من ال threads هتخلص بتبدأ تشوف ميمأربعة
لأنه بمجرد أنه دخلهان حاول يعمل execute مالجهش
space في ال ball فاشرح سوا عمل pause ال counter
زاد فعمل و جفت pause وبالتالي مش حاجة يقدر أكمل أو
حطهم في ال queue فأربعة أو خمسة هتشوفيهم اتباعا
لكن بعد ما حد يخلص من هدول التلاتة اللي في الأول
الآن هذا الكلام هو
زبدة لـ threads تمام؟ و لازم احنا نحاول نفهمه بشكل
واضح في عيوب الآن العيب الأول .. العيب الأول في
حالة زي هذه أنا مافيش عند return data عشان اقدر
اخد القيمة اللي حسبتها وهذا بتدفعني ان اروح اعرف
global variable او اصير اخد ال value و احطه في ال
global variable طب احنا عارفين ان ال global
variable عليها مشاكل دايما و لا يحب تستخدامها
إتنين، لو صار في عندي أي مشكلة في داخل الـ run و
أنا مش عامل ا try و catch، مش هقدر أشوف .. مش هكمل
و مش هعرف أي thread اللي واجف، عشان هيك، راحوا
باتجاه interface مختلف تماما عن الـ runnableراحوا
باتجاه interface مختلف تماما عن الـ runnable حقق
فيه المستن أو عالجوا فيه اللعبين اللي قلنا عليهم
ال return data و ال exception handling الآن الشغل
السابق اللي هو في المثال هذا تقريبا نفسه مع فارق
بسيط جدا انه الآن هذا بيصير callableوالـ method
اسمها call بدل run بدل execute هتكون في عندي
submit وهتكون في عندي return data من نوع future
حلقة
نتكلم في التفاصيل يعني الآن ال code السابق هينضاف
عليه شغلات بسيطة تحقق أو تعالج العيبين اللي حاكينا
عليهم الأولى أن ال callable interface هو عبارة أو
استخدم genericعشان يعمل return ل data type ايش
generic؟ عام يعني بيظبط مع ال integer و بيظبط مع
ال string و بيظبط مع ال employee student .. ال
employee object و مع ال student object .. مع اي
حاجة ال executor هتنفذلي .. يوفرطلي مجموعة او
method عشان تنفذ ال callable اللي اسمها submit
هنشوفها في ال code كمان شوية في حين سابقا مع ال
runnable اسمها execute
one طيب الـ callable بعمل return ل object من نوع
future object من نوع future أول مرة نسمع عن data
type اسمها future صح؟ او ال future هذا هي عبارة عن
container بتحط فيه أي data type عشان هي اسمها
generic وحنشوف زي ما شوفنا مع ال array list أو مع
ال collections ايش كانت ميزة ال collections انها
generic بتاخد أيdata types هو كانت object غلط
تاخدش اللي غير reference data type ايوة ما بتاخد
ايوة بتاخد ال rubber class تبع ال primitive data
تعالى نشوف ال code ماضلش فيه كلام نظر كتير اه اذا
انا بدى ال value اللى موجودة او اللى تم تخزينها فى
ال future فى عندى method اسمها get و بترجع بال
data typeاللي تم إنشاء الـ future عليها تعالى نشوف
ال code البسيط هذا انسيلي ال future في الأول
executor dot new single thread executor نفس ال
code اللي احنا شوفناه سابقا بس كان مع thread pool
مظبوط من تلاتة الآن ايش نوعها future و بتعمل
rubbery class لل integer واسمه F dot
كمل الـ definition هذا dot submit يعني هذا كل ياته
ال code هذا اللي هان هو عبارة لحد اللي هان هيك في
تعريف ال future اللي عندي فوق الآن احنا قلنا سابقا
execute dot execute و
كنت بدّله new runnable مصبوط؟
الان انا روح تدخل الـ new callable و الـ callable
بده data type تتوافق مع ال future اللي انا بده اخد
منه ال data طيب ال callable عمل override او جال
يعمل override ل ال method اللي اسمها call و لازم
تتوافق مع نفس ال data type تبعت ال callable اللي
بتوافق مع ال data type الخاصةلأن في الآخر الـ
callable هي اللي هتعمل return لل data هيسلمها الـ
callable ويمررها لمين؟ لل future وانت بدك تاخد ال
result من ال future الآن في داخلها فقط أنا عملت
هنا مثال بسيط جدا بدي أعمل return ل 115 لي 23 ضرب
5و لا تنسى انها حدثت ان لدي hand صارت تعمل throw
لـ exception يعني لو حدث اي exception هنا في داخل
ال call بقى أشوفه بينما في ال run ماكنتش مقدر أسوي
هيك شغل تمام خلصنا هذا على one thread لو انا بدي
أعمل pool نفس الكلام مافيش مشكلة عندي هتعمل loop
وكل واحدة هترجع ب data type بد ال result الآن هاي
ال resultمش احنا اتفقنا ان ال result اللي هترجع
فيها ال call method هتتخزن وين؟ في ال future هي f
.get بترجعلي بال data type اللي تم تخزينها وين؟ في
داخل ال future الآن ليش حطيت integer أنا هنا؟ عادي
لأن هذا rubber class لهذه وفيها auto boxing و
unboxing، مظبوط؟ مية لميةطيب على مثال ال array ده
ايش المفروض ان انا اساوي لو انا بدي احسب عندي
array من مليون element و بدي اساوي ايش بدي اروح
اساوي هان؟ في ال call في داخل ال call بدي اعمل ليه
switch case عشان اجسم كمان و يحسب و اروح اعمل
return لمين؟ لل sum او لل average مش قضية كتير لل
sum او لل average هيعمل return و هيروح يضيفلي
اليوم في مين؟في ال future بس ال future فيها single
value هذا الآن معناته ال future هذا بيصير عبارة عن
ال ray بيصير عبارة عن ال ray أو ال ray list مصبوط؟
لأن كمان مرة انت تتخيل ان هان عامل احنا ايش هان؟
new single thread executor طب لأ أنا مابديش single
thread executor بيدوروح اقوله؟الـ New Fixed Thread
Pool بديش واحد بدي مجموعة انا خمسة عشان اجسمهم طب
ما هدول الخمسة New
Fixed Thread Pool خمسة
بدي
اعمل counter عشان الـ Submit تبعت عندي هنا صح؟ و
بدي اكملاللي انا بدي اجسم طب ما هي ال future هذي
بدنا معاهده في عندي five threads بدهم يشتغلوا كل
واحد له future فالحل اني اعمل array of futures او
array list of future و بعد هيك انا بروح باخداش ال
value من ال array list او من ال array تبعتي لكن في
شغل مهم جدا هنا مش ضروري ال array .. حفظك ال
thread الأوليخلص قبل ولا لا؟ اللي بيخلص أول هو
اللي بيضيف على ال future أو على ال array list
بتاعة ال future يعني ال index الأولى في ال array
لأول واحد بيخلص التاني على التاني و لا التالت و
هكذا، مصبوط؟ وبالتالي مافيش ضامن إيش الترتيب، بس
الشغل الوحيد اللي أنا بضمنها أن ال value اللي في
ال futureإذا كنت بتتكلم على average، الـ average
تبع الـ average value تاع ال future هي ال average
للarray كلها، وإذا كنت بتتكلم على ال sum، ال sum
لل values اللي موجودة في ال future بتمثل المجموع
تبع ال array كلها، ومن ثم أنا بدأ أكمل حسبتي
للآخر،
حتى هذا مثال هيني أنا بأجمع نفس المثال السابق، بس
أنا كنت بدون ال code هذاروحت جامعت و عملت return
للجامع فاتخزن وين؟ في ال future اللي موجود عندى
ليش انا هذا الكلام؟ عشان اوصلك لنفس المرحلة هذه
اللي انا عملت فيها ال loop هيها executor service
انا اجيت هنا executor service a new single بس مديش
a new single هنا a new fixed thread
boardالـ future هذا هيكون عبارة عن الـ realist من
ال future مصدورة او لا؟ و اصلا انا بدي اتعامل مع
ال element او مع العناصر اللي موجودة عندي هنا في
داخل ال array وهذا كل اللي عندنا في موضوع ال
threads يعني أو بين جسين هذه النقاط الأساسية
المهمة في موضوع ال threadsيوم السبت ان شاء الله
تبارك وتعالى .. ان شاء الله تكفينا الساعة ونحاول
نطبق كل الكلام ده إيش؟ بشكل عامل، نعم مرة
تانية، انشأتي threads أكتر من؟ أكتر من 100%
A K لأ لأ ما بديش هيك تخلطي تخلطي انه كل core
هياخد thread لأ ال thread هي هتكون ال process لل
core الواحد يعني انت في الآخر ال CPU عندك
different cores مظبوط حتى ال core الواحد ideal مثل
الأن مين اللي بتولّى تشغيل ال cores ال operating
systemانت كل اللي بتسويه في ال application بتقوليه
لل operating system انه انا في عندى different task
بدي أنفذها ال operating system اللي بياخدها و
بوزعها خلص ال core الأول هو اللي بيعطي ال core
التاني و بيعطي ال core التالت والرابع طب كل ال
cores busyالـ task تبعتك بتخش في الـ queue تبعت ال
operating system و بنفذها تباع لما بيجيها الدور
أما مالكيش دخل انت ممكن تقل ب 100 على single core
100 thread على single core احنا هي هي بالمثال هذا
إيش عملنا؟ عملت three threads بصبت و روحت قلتله
أنا في عندي خمسة taskوين الـ 1010 الأخرانيات دخلوا
في ال weight أو في ال Q لحد ما يخلص ال pool يصير
فيها متسع و نفس الكلام بيصير عندك على ال operating
system بس مش شغلك انت اللي تعملي له management لأن
ال operating system هو اللي بتدور عندك فانت ما
تقارن أو ما تربط بعدد ال thread بعدد ال cores اللي
موجودة عندك على المعالج أي سؤال تاني بنات؟