ما هو تجمع الخيوط
تجمع مؤشرات الترابط هو مجموعة من المواضيع التي [تنفيذ الحلقة] منطق تطبيق متعدد في مؤشر ترابط واحد أو أكثر.
بشكل عام ، تحتوي تجمعات الخيوط على الأجزاء التالية:
واحد أو أكثر من المواضيع التي تكمل المهمة الرئيسية.
مواضيع الإدارة المستخدمة في الجدولة.
قائمة انتظار المهمة المطلوبة ليتم تنفيذها.
وظيفة تجمع الخيوط:
تتمثل وظيفة تجمع مؤشرات الترابط في الحد من عدد مؤشرات الترابط التي تم تنفيذها في النظام.
اعتمادًا على بيئة النظام ، يمكن تعيين عدد مؤشرات الترابط تلقائيًا أو يدويًا لتحقيق أفضل تأثير للتشغيل ؛ يتم إهدار موارد النظام الأقل ، ومزيد من احتقان النظام ليس مرتفعًا. استخدم تجمع مؤشرات الترابط للتحكم في عدد مؤشرات الترابط ، وينتظر مؤشرات الترابط الأخرى في الخط. بعد تنفيذ المهمة ، يتم أخذ المهمة الأولى من قائمة الانتظار لبدء التنفيذ. إذا لم تكن هناك عملية انتظار في قائمة الانتظار ، فإن مورد تجمع الخيوط هذا ينتظر. عندما تحتاج مهمة جديدة إلى تشغيل ، إذا كانت هناك مؤشرات ترابط عامل انتظار في مجموعة مؤشرات الترابط ، فيمكنها البدء في التشغيل ؛ خلاف ذلك ، سوف يدخل قائمة انتظار الانتظار.
قم بتنفيذ تجمع الخيوط بنفسك
استنادًا إلى الفهم المذكور أعلاه لمجموعة مؤشرات الترابط ، نكتب تجمع الخيوط البسيط الخاص بنا:
واجهة تجمع الخيوط البسيطة:
الواجهة العامة ThreadPool <Job تمتد Runnable> {// تنفيذ مهمة (وظيفة) ، يجب أن تنفذ هذه المهمة تنفيذ void القابل للتشغيل (Job Job) ؛ // أغلق الإغلاق الفراغ لمسبح الترابط () ؛ // قم بزيادة مؤشر ترابط العامل ، أي مؤشر الترابط المستخدم لتنفيذ عامل إضافات الفراغ المهمة (int num) ؛ // تقليل باطل مؤشر ترابط العامل removeworker (int num) ؛ // احصل على عدد المهام التي تنتظر تنفيذ GetJobsize () ؛}يمكن للعميل إرسال المهمة إلى مجموعة مؤشرات الترابط من خلال طريقة التنفيذ (الوظيفة) للتنفيذ ، ولا يتعين على العميل انتظار تنفيذ المهمة على الإطلاق. بالإضافة إلى طريقة التنفيذ (JOB) ، توفر واجهة تجمع مؤشرات الترابط طرقًا لزيادة/تقليل مؤشرات ترابط العمال وتجمعات الخيوط الإغلاق. يقدم كل عميل وظيفة ستدخل قائمة انتظار عمل وانتظر معالجة مؤشر ترابط العامل.
التنفيذ الافتراضي لواجهة تجمع مؤشرات الترابط
الطبقة العامة defaultThreadPool <Job تمتد Runnable> تنفيذ ThreadPool <Job> {// الحد الأقصى لعدد مؤشرات الترابط لمؤشر ترابط تجمعات التجمع الخاصة بموضوع الصيانة الخاص الثابتة النهائية int max_worker_numbers = 10 ؛ // القيمة الافتراضية لمؤشر ترابط تجمعات التجمع ، مؤشر ترابط مؤسسة التمويل الخاصة ، Final int default_worker_numbers = 5 ؛ . // الحفاظ على قائمة عمل ، والتي تضيف قائمة LinkedList Final LinkedList <BOB> الوظيفية = JOBList <BOB> () ؛ // قائمة المواضيع الخاصة بالعامل القائمة النهائية الخاصة <worker> العمال = collections.synchronizedList (ArrayList جديد <worker> ()) ؛ // عدد مواضيع العمال الخاصة عمال. // إنشاء atomiclong threadnum = new Atomiclong () ؛ // إنشاء مؤشرات الترابط تجمع PublicTherThreadPool () {this.workernum = default_worker_numbers ؛ أخصائيو initializework (this.workernum) ؛ } Public DefaultThreadPool (int num) {if (num> max_worker_numbers) {this.workernum = default_worker_numbers ؛ } آخر {this.workernum = num ؛ } initializework (this.workernum) ؛ } // تهيئة كل مؤشر ترابط العامل الخاص باختصار خاص (int num) {for (int i = 0 ؛ i <num ؛ i ++) {worker worker = new worker () ؛ // أضف إلى قائمة العمال العمال العمال (العامل) ؛ // ابدأ مؤشر ترابط مؤشر ترابط مؤشر ترابط مؤشر ترابط العامل = مؤشر ترابط جديد (عامل) ؛ thread.start () ؛ }} void public execute (Job Job) {if (Job! = null) {// وفقًا لآلية الانتظار/الإخطار بالرسائل ، يجب علينا قفل الوظائف المتزامنة (الوظائف) {Jobs.AddLast (Job) ؛ الوظائف. notify () ؛ }}} // أغلق مجموعة مؤشرات الترابط التي تتمثل في إغلاق كل سلسلة من المواضيع العامة الإغلاق () {for (العامل W: العمال) {w.shutdown () ؛ }}} // أضف مؤشر ترابط العمال العام الإضافات العامة (int num) {// إضافة قفل لمنع مؤشر الترابط من الزيادة أو الإكمال في حين يستمر مؤشر الترابط التالي في الزيادة ، مما تسبب في أن يتجاوز مؤشر ترابط العامل الحد الأقصى لقيمة متزامنة (وظائف) {if (num + this.workernum> max_worker_nembers) {num = max_numbers. } initializework (num) ؛ this.workernum += num ؛ }} // قلل من سلسلة العمال الفراغ العام removeworker (int num) {synchronized (Jobs) {if (num> = this.workernum) {رمي جديد alficalArgumentException ("يتجاوز عدد مؤشرات الترابط الموجودة") ؛ } لـ (int i = 0 ؛ i <num ؛ i ++) {عامل العمال = العمال. get (i) ؛ if (عامل! = null) {// أغلق مؤشر الترابط وإزالة العامل. shutdown () ؛ العمال. }} this.workernum -= num ؛ }} public int getJobsize () {// todo method method method tuto method rotgen. size () ؛ }. public void run () {بينما (تشغيل) {Job Job = null ؛ // مؤشر ترابط آلية الانتظار/الإخطار متزامنة (الوظائف) {if (jobs.isempty ()) {try {jobs.wait () ؛ // thread ينتظر wakeup} catch (interruptedException e) {// senses عملية المقاطعة الخارجية على الموضوع ، وإرجاع thread.currentthread (). يعود؛ }} // إخراج وظيفة الوظيفة = Jobs.RemoveFirst () ؛ } // تنفيذ الوظيفة if (Job! = null) {Job.run () ؛ }}} // إنهاء مؤشر ترابط public void shutdown () {running = false ؛ }}}
من تنفيذ مجموعة مؤشرات الترابط ، يمكن ملاحظة أنه عندما يتصل العميل بالطريقة (JOB) ، فإنه سيضيف باستمرار وظائف إلى وظائف قائمة المهام ، ولن يقرأ كل مؤشر ترابط عامل الوظائف من الوظائف لتنفيذها. عندما تكون الوظائف فارغة ، يدخل موضوع العامل إلى حالة الانتظار.
بعد إضافة وظيفة ، يتم استدعاء طريقة الإخطار () في وظائف قائمة انتظار العمل لإيقاظ موضوع العمال. هنا لا ندعو الإخطار () لتجنب إهدار الموارد عن طريق نقل جميع المواضيع في قائمة انتظار الانتظار إلى قائمة انتظار الحظر.
يتمثل جوهر تجمع مؤشرات الترابط في استخدام قائمة انتظار عمل آمنة مؤشر ترابط لتوصيل مؤشرات ترابط العمال ومواضيع العميل. يعود مؤشر ترابط العميل بعد وضع المهمة في قائمة انتظار العمل ، بينما يأخذ مؤشر ترابط العامل العمل بشكل سوء العمل من قائمة انتظار العمل وينفذها. عندما تكون قائمة انتظار العمل فارغة ، يدخل مؤشر ترابط العامل إلى حالة الانتظار. عندما يرسل العميل مهمة ، فسيتم مرور أي موضوع عامل. مع تقديم عدد كبير من المهام ، يتم إيقاظ المزيد من خيوط العمال.
المرجع: "فن البرمجة المتزامنة في جافا" فانغ تينجفيي