سؤال

يبدو المنفذ مثل التجريد النظيف. متى تريد استخدام مؤشر ترابط مباشرة بدلا من الاعتماد على المنفذ الأكثر قوة؟

هل كانت مفيدة؟

المحلول

لإعطاء بعض التاريخ، تم إضافة المنفصين فقط كجزء من قياسي Java في Java 1.5. لذلك في بعض الطرق، يمكن اعتبار المنفكين كممخرين أفضل جديد للتعامل مع المهام الرودرة.

قليلا من التبسيط الزائد القادم ... - المنفصون هم المواضيع القيام به الحق في استخدامها في تفضيل.

نصائح أخرى

يمكنني استخدام الخيط عندما أحتاج إلى بعض معالجة الرسائل القائمة على السحب. على سبيل المثال، تأخذ قائمة الانتظار () - EN في حلقة في مؤشر ترابط منفصل. على سبيل المثال، تفتتح قائمة انتظار في سياق باهظ الثمن - دعونا نقول اتصال JDBC، اتصال JMS، الملفات المعالجة من قرص واحد، إلخ.

قبل أن أحصل على لعن، هل لديك بعض السيناريو؟

يحرر:

كما ذكر من قبل الآخرين، Executor (ExecutorServiceواجهة لديها إمكانات أكثر، كما يمكنك استخدام Executors لتحديد سلوك: مجدولة، أولوية، مخزنة مؤقتا، إلخ. في Java 5+ أو Backport Juc For Java 1.4.

يحتوي إطار المنفذ على الحماية ضد Runnables تحطمت وإعادة إنشاء مؤشرات ترابط العمال تلقائيا. عيب واحد في رأيي، أن عليك صراحة shutdown() و awaitTermination() لهم قبل الخروج من طلبك - وهذا ليس بالأمر السهل في تطبيقات GUI. إذا كنت تستخدم قوائم الانتظار المحددة تحتاج إلى تحديد RejectedExecutionHandler أو يتم إلقاء الراديبات الجديدة.

قد يكون لديك نظرة على براين جوتز وآخرون: جافا تزامن في الممارسة (2006)

لا توجد ميزة لاستخدام المواضيع الخام. يمكنك دائما توفير المنتضين مع مصنع مؤشر ترابط، حتى يتم تغطية خيار إنشاء مؤشر ترابط مخصص.

لا تستخدم مؤشر ترابط ما لم تكن بحاجة إلى سلوك أكثر تحديدا غير موجود في مؤشر الترابط نفسه. يمكنك بعد ذلك تمديد الخيط وإضافة سلوكك المطلوب على وجه التحديد.

آخر فقط استخدم Runnable أو المنفذ.

حسنا، اعتقدت أن Threadpoolexecutor قدم أداء أفضل لأنه يدير مجموعة من المواضيع، مما يقلل من النفقات العامة لفكرة إنشاء موضوع جديد، تخصيص الذاكرة ...

وإذا كنت ستقوم بتشغيل الآلاف من الخيوط، فإنه يمنحك بعض الوظائف في قائمة التحويل التي يجب عليك برنامجك ...

المواضيع والمنفذين عبارة عن أدوات مختلفة، وتستخدم في سيناريوهات مختلفة ... كما أراه، يشبه السؤال لماذا يجب علي استخدام ArrayList عندما يمكنني استخدام Hashmap؟ هم مختلفون...

توفر حزمة Java.util.concurrent واجهة المنفذ ويمكن استخدامها لإنشاء مؤشر ترابط.

توفر واجهة المنفذ طريقة واحدة، وتنفيذها، مصممة لتكون بديلا للانخفاض في إنشاء مؤشر ترابط مشترك. إذا كانت ص كائن Runnable، و E هو كائن منفذي يمكنك استبداله

(موضوع جديد (R)). ابدأ ()؛

مع

e.execute (ص)؛

أشير هنا

من الأفضل دائما أن تفضل المنفذ ل Thread حتى للحصول على موضوع واحد على النحو التالي

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);

يمكنك استخدام Thread على Executor في سيناريوهات أدناه

  1. يحتاج طلبك يحتاج إلى مؤشر ترابط محدود ومنطق الأعمال بسيط

  2. إذا كان نموذج بسيط متعدد الخيوط يلبي الاحتياجات الخاصة بك دون تجمع الموضوع

  3. أنت واثق من إدارة سيناريوهات التعامل مع مؤسسات الحياة + الخيط مع مساعدة من واجهات برمجة التطبيقات ذات المستوى المنخفض في المناطق أدناه: Inter thread communication, Exception handling, reincarnation of threads بسبب أخطاء غير متوقعة

ونقطة أخيرة

  1. إذا كان التطبيق الخاص بك لا يحتاج إلى تخصيص ميزات مختلفة من ThreadPoolExecutor

    ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
    TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, 
    RejectedExecutionHandler handler)
    

في جميع الحالات الأخرى، يمكنك الذهاب ل ThreadPoolExecutor

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top