استخدام نمط الـ Thread Pools كـ Singleton

Mohammad Laifمنذ 3 سنوات

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

 

في الدرس السابق تعرفنا على نمط الـ Thread Pools (الـ Executors) ورأينا طريقة استخدام واحده له وهي scheduledExecutorService لملئ قاعدة البيانات الـ Room بعد انقضاء ثانيه واحده. في هذا الدرس سنرى طريقة دمج هذا النمط مع نمط الـ Singleton وذلك حتى يسهل استخدامه اينما نريد بشكل سريع جداً. وبالطبع سنقوم بأستخدامه مع قاعدة البيانات الـ Room في كلاس الـ Repository لإجراء عمليات الحفظ والقرائة وماشابهه ذلك لقاعدة البيانات.

 

 قبل اكمال القرائه في هذا الدرس:

هذا الدرس قائم على استخدام قاعدة البيانات الـ Room والعديد من انماط التصميم الـ MVVM و Repository لذلك ستحتاج معرفه بسيطه بهم لفهم هذا الدرس. وبالمناسبة لقد قمت بكتابة دورة تتعلق بهذة الاشياء كلها تستطيع الاطلاع عليها في هذا الرابط: Android Architecture Components (دروس لتعلم Android Architecture Components من حزمة Android JetPack بلغة الجافا لتصميم تطبيقات الاندرويد).

 

السيناريو

لدينا قاعدة بيانات Room لانستطيع استخدامها في الخيط الرئيسي (ممنوع من النظام), لذلك سنتظر الى انشاء خيوط خلفيه باستخدام نمط الـ Thread Pools حتى نتمكن من استخدامها.

 

استخدام الـ ThreadPools كـ Singleton
عندما نريد استخدام الـ Executors في اماكن كثيره في تطبيقنا نستطيع عملها ككلاس من نمط Singleton ثم استخدامها اين مانريد. مثلاً كاستخدام متعدد لهذا النمط في كلاس الـ Repository الخاص بقاعدة البيانات الـ Room (كما رئينا في درس سابق بعنوان: انشاء المستودع بـ LiveData في جزئية: كيفية عمل Executor؟).

 

الكلاس الـ Singleton التي تحتوي على نمط الـ Executor كالتالي:

public class AppExecutor {
    private static final Object LOCK = new Object();
    private static AppExecutor sInstance;
    private final Executor mDiskIO;

    public AppExecutor(Executor diskIO) {
        mDiskIO = diskIO;
    }

    public static AppExecutor getInstance() {
        if (sInstance == null) {
            synchronized (LOCK) {
                sInstance = new AppExecutor(Executors.newSingleThreadExecutor());
            }
        }
        return sInstance;
    }

    public Executor diskIO() {
        return mDiskIO;
    }

}

عباره عن نمط Singleton عادي.

 

لاحظ استخدام تقنية القفل Lock وكلمة synchronized حتى لايحدث احد اخطاء التزامن (الـ Concurrency) الشائعة.

 

ركز في هذا السطر البرمجي:

sInstance = new AppExecutor(Executors.newSingleThreadExecutor());

وهو الذي سينشئ لنا Executor من نوع newSingleThreadExecutor يحتوي على خيط حاسوبي واحد فقط.

 

طريقة استخدامها (في كلاس الـ Respoitory الخاص بالـ Room) لتشغيل الدالة insert لقاعدة البيانات:

    public void insert(final NameEntity nameEntity) {
        AppExecutor.getInstance().diskIO().execute(new Runnable() {
            @Override
            public void run() {
                mNameDao.insertName(nameEntity);
            }
        });
    }

 

لاحظ الجزئيه:

.execute(new Runnable() {
            @Override
            public void run() {
                mNameDao.insertName(nameEntity);
            }
        });

والتي فيها ننشئ Runnable وبداخله الشفرة المراد تشغيلها في الـ Executor (وهي شفرة خاصة لإدراج العناصر في قاعدة البيانات).

 

نستطيع تكرار الامر مع باقي دوال قاعدة البيانات كالـ Delete:

    public void delete(final NameEntity nameEntity) {
        AppExecutor.getInstance().diskIO().execute(new Runnable() {
            @Override
            public void run() {
                mNameDao.deleteName(nameEntity);
            }
        });
    }

 

في هذا الدرس تعرفنا على طريقة استخدام نمط الـ Thread Pools (الـ Executors) مع نمط الـ Singleton حتى نكرر استخدامه بشكل امن وبالتأكيد قمنا بقفل هذه الكلاس باستخدام تقنية القفل. في الدرس القادم سنرى استخدام نمط الـ Thread Pools مع الـ Callable لإرجاع قيم مستقبليه, بعكس هذا الدرس الذي تم استخدام فيه الـ Runnable الذي لايقوم بإرجاع اي شئ.

 

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

 

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

راجع درس ماهو نمط الـ Thread Pools (الـ Executors).

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

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

المحاضر

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 إعجاب
2 متابع
0 مشاركة
1444 مشاهدات
منذ 3 سنوات

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

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

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