متى يجب أن نستخدم موضوع Java عبر المنفذ؟
-
11-09-2019 - |
سؤال
يبدو المنفذ مثل التجريد النظيف. متى تريد استخدام مؤشر ترابط مباشرة بدلا من الاعتماد على المنفذ الأكثر قوة؟
المحلول
لإعطاء بعض التاريخ، تم إضافة المنفصين فقط كجزء من قياسي 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
في سيناريوهات أدناه
يحتاج طلبك يحتاج إلى مؤشر ترابط محدود ومنطق الأعمال بسيط
إذا كان نموذج بسيط متعدد الخيوط يلبي الاحتياجات الخاصة بك دون تجمع الموضوع
أنت واثق من إدارة سيناريوهات التعامل مع مؤسسات الحياة + الخيط مع مساعدة من واجهات برمجة التطبيقات ذات المستوى المنخفض في المناطق أدناه:
Inter thread communication, Exception handling, reincarnation of threads
بسبب أخطاء غير متوقعة
ونقطة أخيرة
إذا كان التطبيق الخاص بك لا يحتاج إلى تخصيص ميزات مختلفة من
ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
في جميع الحالات الأخرى، يمكنك الذهاب ل ThreadPoolExecutor