عند تشغيل تطبيق في العالم الحقيقي، نستخدم معالجات جيدة لتنفيذ أسرع. ولكن، سرعة المعالج وحدها لا تجعل التطبيق يعمل بسرعة. إحدى الطرق العظيمة لإنشاء تطبيق فعال من حيث الأداء هي استخدام التعداد المتعدد.
ما هو التعداد المتعدد؟
التعداد المتعدد هو مفهوم برمجي يتيح للتطبيق إنشاء وحدة صغيرة من المهام للتنفيذ بشكل متوازٍ. إذا كنت تعمل على جهاز كمبيوتر، يعمل على تشغيل تطبيقات متعددة ويخصص قوة المعالجة لها. يعمل البرنامج البسيط بالتسلسل وتنفيذ تعليمات البرمجة واحدة تلو الأخرى. وهذا يعتبر تطبيقًا ذو خط واحد. ولكن، إذا كان لغة البرمجة تدعم إنشاء مواضيع متعددة وتمريرها إلى نظام التشغيل للتنفيذ بشكل متوازٍ، فإنه يُسمى التعداد المتعدد.
التعداد المتعدد مقابل المعالجة المتعددة
عندما نتحدث عن التعداد المتعدد، لا يهمنا ما إذا كان للجهاز معالج ثنائي النواة أو معالج بـ 16 نواة. عملنا هو إنشاء تطبيق متعدد المواضيع والسماح لنظام التشغيل بالتعامل مع عملية التخصيص والتنفيذ. إجمالاً، التعداد المتعدد ليس له علاقة بالمعالجة المتعددة.
كيف يدعم جافا التعددية في التنفيذ؟
تحظى جافا بدعم كبير لتطبيقات التعددية. تدعم جافا التعددية من خلال فئة Thread. تسمح لنا فئة Thread في جافا بإنشاء عمليات خفيفة تنفذ بعض المهام. يمكننا إنشاء عدة خيوط في برنامجنا وتشغيلها. ستهتم بيئة تشغيل جافا بإنشاء تعليمات على مستوى الآلة والتعامل مع نظام التشغيل لتنفيذها بشكل متزامن.
ما هي أنواع الخيوط المختلفة؟
هناك نوعان من الخيوط في التطبيق – user thread و daemon thread. عند بدء تشغيل التطبيق، تعتبر main هي أول خيط مستخدم يتم إنشاؤه. يمكننا إنشاء العديد من خيوط المستخدم وأيضًا خيوط الشياط عند الحاجة. عندما تنتهي جميع خيوط المستخدم من التنفيذ، يقوم الجهاز الظاهري بإنهاء البرنامج.
ما هو أولوية الخيط؟
عند إنشاء خيط، يمكننا تعيين أولويته. يمكننا تعيين أولويات مختلفة لخيوط مختلفة ولكن لا يضمن ذلك أن يتم تنفيذ خيط بأولوية أعلى قبل خيط بأولوية أقل. جدول تسلسل التنفيذ هو جزء من تنفيذ نظام التشغيل وعند بدء تشغيل خيط، يتم التحكم في تنفيذه بواسطة جدول تسلسل التنفيذ وليس لدى الآلة الظاهرية لـ Java أي تحكم في تنفيذه.
كيف يمكننا إنشاء خيط في جافا؟
يمكننا إنشاء الخيوط سواء عن طريق تنفيذ واجهة Runnable أو عن طريق تمديد فئة Thread.
Thread t = new Thread(new Runnable(){
@Override
public void run() {
}
});
الجملة أعلاه هي عبارة عن سطر واحد لإنشاء خيط جديد. في هذا المثال، نقوم بإنشاء Runnable كفئة مجهولة. إذا كنت على دراية بتعبيرات اللامبدا، يمكننا إنشاء خيط بشيفرة أقصر بكثير.
Runnable runnable = () -> System.out.println("Hello");
بمجرد أن نقوم بإنشاء خيط، يجب أن نبدأ تنفيذه بالاتصال بطريقة start().
runnable.start();
I have written a lot of posts explaining the concepts of multithreading in Java. You can go through these in sequence to learn everything about multithreading, its real-life usage, thread lifecycle, thread pool, etc.
1. خيط جافا و Runnable
هذه هي أول مشاركة حول فئة Thread وواجهة Runnable. ستتعلم أيضًا حول العمليات والمواضيع. ما هو الفرق بين Thread و Process؟ فوائد استخدام Threads وكيف يمكننا إنشاء Threads باستخدام واجهة Runnable وفئة Thread. تقارن هذه المشاركة أيضًا بين واجهة Runnable وفئة Thread.
2. Java Thread Sleep
Java Thread sleep يُستخدم لإيقاف تنفيذ الموضوع الحالي. سنستخدم Thread sleep بشكل واسع في المشاركات القادمة، لذا من الجيد أن نعرف كيف يعمل وهل هو دقيق أم لا؟
3. Java Thread Join
في بعض الأحيان نحتاج إلى انتظار انتهاء تنفيذ مواضيع أخرى قبل أن نتمكن من المتابعة. يمكننا تحقيق ذلك باستخدام طريقة Thread join. تعلم كيف يعمل ومتى يجب علينا استخدامه.
4. حالات خيوط Java
فهم مختلف حالات الخيط مهم. تعلم كيفية تغيير حالة الخيط وكيفية تغيير جدول المهام لنظام التشغيل حالة الخيط.
5. انتظار الخيط في Java، والتنبيه والتنبيه الكلي
تحتوي فئة Object في Java على ثلاث طرق للتواصل مع حالة القفل لمورد. تعلم مع استخدام أمثلة لهذه الطرق في تنفيذ بسيط للانتظار والتنبيه.
6. سلامة الخيوط والتزامن
نحن نعلم أن الخيوط تشترك في موارد الكائنات، مما يمكن أن يؤدي إلى تلف البيانات لأن هذه العمليات ليست ذات طبيعة ذرية. تعرف على كيفية تحقيق سلامة الخيط في جافا باستخدام طرق مختلفة. اقرأ هذه المقالة لتتعرف على الاستخدام الصحيح للتزامن، والأساليب المتزامنة، والكتل المتزامنة.
7. استثناء جافا في الخيط الرئيسي
تنشئ الآلة الظاهرية لجافا الخيط الأول باستخدام الطريقة الرئيسية. تشرح هذه المقالة بعض الاستثناءات الشائعة التي نراها في الحياة اليومية وما هو سببها الجذري وكيفية إصلاحها.
8. سلامة الخيط في الفئة الوحيدة
في هذه المقالة، ستتعلم المفاهيم الأساسية لإنشاء فئة وحيدة. ما هي مشاكل سلامة الخيط مع تنفيذات مختلفة؟ كيف يمكننا تحقيق سلامة الخيط في فئة الوحيدة.
9. الخيط الشيطاني في جافا
A simple article explaining daemon threads and how we can create daemon threads in java.
10. الخيط المحلي في جافا
نعلم أن الخيوط تشترك في متغيرات الكائنات ولكن ماذا لو أردنا أن نملك متغيرات خاصة بالخيط تم إنشاؤها على مستوى الفئة. توفر جافا فئة الأداة المساعدة ThreadLocal لإنشاء متغيرات خاصة بالخيط. اقرأ المزيد لتعرف كيف يمكننا إنشاء متغيرات ThreadLocal في برنامج جافا.
11. تفريغ خيط جافا
تفريغ الخيط جافا يوفر معلومات حول الخيط الحالي. يكون تفريغ الخيط مفيدًا لتحليل مشاكل الأداء في التطبيق. يمكنك استخدام تفريغ الخيط للعثور على وإصلاح حالات الانتظار المتعددة. يشرح هذا المنشور طرقًا مختلفة يمكن استخدامها لإنشاء تفريغات للخيط في جافا.
12. كيفية تحليل الانتظار المتعدد في جافا
التعتيم هو موقف يحدث عندما تنتظر خيوط متعددة بعضها البعض لإطلاق الموارد، مما يتسبب في وجود تبعية دورية. يناقش هذا المقال الحالة التي يمكننا أن نواجه فيها تعتيمًا في برنامج جافا. كيف يمكننا استخدام تفريغ الخيط للعثور على التعتيم وأفضل الممارسات لتجنب التعتيم في برنامج جافا.
13. خيط مؤقت جافا
يشرح هذا المنشور كيفية استخدام فئتي Java Timer و TimerTask لإنشاء مهام تعمل في فترة زمنية محددة، بالإضافة إلى برنامج مثال يوضح كيفية استخدامها وكيفية إلغاء المؤقت.
14. مشكلة المنتج والمستهلك في جافا
قبل جافا 5، كان بإمكاننا حل مشكلة المنتج والمستهلك باستخدام طرق الانتظار (wait()) والإشعار (notify()) ولكن تم تبسيط الأمر بفضل إدخال BlockingQueue. تعلم كيف يمكننا استخدام BlockingQueue لحل مشكلة المنتج والمستهلك في جافا.
15. حوض تنفيذ الخيط في جافا
حوض تنفيذ الخيط في جافا هو مجموعة من خيوط العمل في انتظار معالجة المهام. قد جعل إطلاق إطار العمل Executor في جافا 5 من السهل جدًا إنشاء حوض تنفيذ الخيط في جافا. يمكننا استخدام فئات Executors وThreadPoolExecutor لإنشاء وإدارة حوض تنفيذ الخيط.
16. جافا Callable Future
في بعض الأحيان نريد أن يعيد الخيط الخاص بنا بعض القيم التي يمكننا استخدامها. يمكن استخدام جافا 5 Callable في هذه الحالة ، والتي تشبه واجهة Runnable. يمكننا استخدام إطار العمل لتنفيذ المهام Callable.
١٧. مثال Java FutureTask
فئة FutureTask هي الفئة الخرسانية الأساسية التي تنفذ واجهة Future. نستخدمها مع التنفيذيات للمعالجة الغير متزامنة. توفر فئة FutureTask طرق تنفيذ للتحقق من حالة المهمة وإرجاع القيمة إلى البرنامج الذي يتصل بها بمجرد الانتهاء من معالجتها. يأتي في الوقت المناسب عندما تريد تجاوز بعض طرق التنفيذ لواجهة المستقبل.
الاستنتاج
التعددية هي موضوع واسع جدًا وكتابة كل شيء عنه في مقالة واحدة لم يكن ممكنًا. إذا مررت بالمقالات السابقة بالتتابع، ستتعلم كل شيء عن التعددية في جافا.
Source:
https://www.digitalocean.com/community/tutorials/multithreading-in-java