انشاء الخيط الحاسوبي

Mohammad Laifمنذ 3 سنوات

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

 

في الدرسين السابقين تعرفنا على الخيوط الحاسوبية ومكوناتها, والان جاء الوقت في هذا الدرس لإنشاء اول خيط حاسوبي لنا. ففي هذا الدرس سنقوم بعمل خيط حاسوبي خاص بنا عن طريق الوراثه باستخدام كلاس الـ Thread وفي مثال اخر بعمل implements للواجهة الـ Runnable واخيراً بمثال سريع لإنشاء الخيط. ليصبح لدينا ٤ خيوط حاسوبية (لاتنسى ان الخيط الاول نظام الاندرويد ينشئه لتطبيقنا ويسمى بالـ Main Thread او بالـ UI Thread).

 

 

انظر في الصورة كيف ان الـ Handler يستلم الشفرة البرمجية من التطبيق المغلفة بداخل الـ Runnable ثم يغلفها بداخل Message ويرسلها الى الـ Message Queue لتوضع على الخيط الحاسوبي متجهه الى احد الانويه (Core)  التي تدعم الخيوط (Thread)  للمعالج ليتم معالجتها. لاحط ايضاً دور الـ Looper في تشغيل هذا الخيط وسيره الى الامام.

 

انشاء خيط حاسوبي بإستخدام كلاس الـ Thread

الخطوات:
نقوم بإنشاء كلاس جديدة ولتكن بأسم MyThread ونعمل extends لكلاس الـ Thread الموجودة في الـ Android SDK كالتالي:

public class MyThread extends Thread {}

 

نقوم بعمل Override للدالة run وبداخلها نضع الشفرة البرمجية المراد تشغيلها على هذا الخيط, كالتالي:

    @Override
    public void run() {
        super.run();
        Log.d(TAG, "run: I'm running from Thread -> " + Thread.currentThread().getName());
    }

 

من اين جائت دالة الـ run؟ جائت من الـ Runnable! لو قمت بقرائة كلاس الـ Thread الموجودة في الـ Andriod SDK للاحظت انها تقوم بعمل implements للواجهة Runnable التي بدورها تحتوي على الدالة run.

 

لتصبح الكلاس كاملة على النحو التالي:

public class MyThread extends Thread {
    
    private static final String TAG = "MyThread";

    @Override
    public void run() {
        super.run();
        Log.d(TAG, "run: I'm running from Thread -> " + Thread.currentThread().getName());
    }

}


ولتشغيل هذا الخيط من الـ Activity ننشئ عنصر لها ونستدعي الداله start له:

MyThread myThread = new MyThread();
myThread.start();

 

انشاء خيط حاسوبي بإستخدام الواجهة الـ Runnable

في المثال السابق رأينا كيفية عمل خيط حاسوبي باستخدام كلاس الـ Thread بدون الحاجة لواجهة Runnable (لإنها تقوم بعمل impelment لها بشكل implicit اي غير ظاهري). في هذا المثال سنقوم بعمل نفس الشئ ولكن باستخدام الواجهة Runnable (بشكل explicit اي ظاهر).

 

الخطوات:
نقوم بعمل كلاس جديدة ولتكن بأسم MyRunnable ونعمل implements للواجهة Runnable الموجودة في الـ Android SDK كالتالي:

public class MyRunnable implements Runnable {}

 

نقوم بعمل Override للدالة run وبداخلها نضع الشفرة البرمجية المراد تشغيلها على هذا الخيط, كالتالي:

    @Override
    public void run() {
        Log.d(TAG, "run: I'm running from Thread -> " + Thread.currentThread().getName());
    }

 

لتصبح الكلاس كاملة على النحو التالي:

public class MyRunnable implements Runnable {

    private static final String TAG = "MyRunnable";

    @Override
    public void run() {
        Log.d(TAG, "run: I'm running from Thread -> " + Thread.currentThread().getName());
    }

}

 

 

ولتشغيل هذا الـ Runnable نحتاج لإنشاء خيط حاسوبي حتى يمر عليه الى المعالج كالتالي (في الـ Activity):

MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();

 

نستطيع ايضاً تشغيلة بشكل متأخر, وذلك بتحديد وقت Delay لوضعه على الخيط الحاسوبي باستخدام الـ Handler.
 

Handler handler = new Handler();
handler.postDelayed(myRunnable, 5000);

 

انشاء خيط حاسوبي بشكل مختصر

نستطيع انشائها ايضاً بشكل مختصر في اي مكان هكذا:

        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "run: I'm running from Thread -> " + Thread.currentThread().getName());
            }
        });

 

 

اي الطرق اختار؟ من الافضل اختيار الطريقة التي تقوم بعمل implements للواجهة Runnable. لماذا؟ حتى تتمكن من استخدام الوراثه اذا احببت! فمن المعلوم ان في لغة الجافا لاتستطيع الوراثه الا من كلاس واحدة فقط.

 

رأينا في هذا الدرس كيفية صناعة الخيوط الحاسوبية بأستخدام الكلاس الـ Thread واخرى باستخدام الواجهة Runnable وايضاً طريقة مختصرة لصنع الخيط الحاسوبي. في الدروس القادمة سنرى الانماط المشهورة في برمجة الاندرويد لصناعة الخيوط الحاسوبية والتي تمتاز بالمرونه لصناعة تطبيق محكم بعيداً عن مشاكل المزامنه وماشابه ذلك اذا طبقت بشكل سليم.

 

رابط الكلاسات المستخدمه في هذا الدرس:

للحصول على رابط المشروع راجع درس المقدمة.

 

المصادر والمراجع

للمزيد راجع درس المقدمة.

 

نهاية الدرس
لاتنسى تتبع الدرس والدورة كذلك لإشعارك عندما يتم التعديل على المتحوى او اضافة المزيد من المعلومات. ايضاً لاتنسى الاعجاب بالدرس ومشاركته مع الاخرين.

المحاضر

Mohammad Laif

محتوى الدورة

تمهيد
1 مقدمة
2 تعرف على التزامن (الـ Concurrency)
3 اخطاء التزامن (الـ Concurrency) الشائعة
العمليات Processes
1 الهيكلة الهندسية لبيئة نظام الاندرويد
2 طبقة الـ Android Runtime و العمليات Processes
3 انواع العمليات (Processes)
الخيوط الحاسوبية Threads
1 الخيوط الحاسوبية (Threads)
2 مكونات الخيوط الحاسوبية (Thread)
3 انشاء الخيط الحاسوبي الدرس الحالي
أنماط التصميم للخيوط الحاسوبية
1 انشاء نمط الـ Handler و Looper و Thread
2 انشاء نمط الـ HandlerThreads
3 ماهو نمط الـ Thread Pools (الـ Executors)
4 استخدام نمط الـ Thread Pools كـ Singleton
5 استخدام الـ Callable مع نمط الـ Thread Pools
6 انشاء بركة خيوط حاسوبية Thread Pools لتسريع قاعدة البيانات
7 انشاء نمط الـ AsyncTask
8 انشاء نمط الـ Loader
الـ Broadcasts
1 تعرف على الـ Broadcast Receiver
2 انشاء الـ Broadcast Receiver بشكل ثابت
3 انشاء الـ Broadcast Receiver بشكل ديناميكي
4 استخدام الـ Local Broadcast للتخاطب بين المكونات
الـ Services
1 تعرف على الـ Services
2 انشاء الـ Started Service
3 انشاء الـ Intent Service
4 انشاء الـ Bound Service
5 استخدام الـ ResultReceiver للتخاطب مع الـ Intent Service
6 استخدام الـ Broadcast للتخاطب مع الـ Started Service
الـ Alarm Manager
1 تعرف على الـ Alarm Manager
2 طرق استخدام الـ Alarm Manager
الـ Jobs
1 استخدام الـ Android JobSchedualer
2 استخدام الـ Firebase JobDispatcher
3 استخدام الـ WorkManager من حزمة JetPack

الكلمات الدليلية

عن الدرس

0 إعجاب
1 متابع
0 مشاركة
2109 مشاهدات
منذ 3 سنوات

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !