1. مفهوم مؤشر الترابط: يشير مؤشر الترابط إلى تدفق تنفيذ المهمة من البداية إلى النهاية. يوفر الموضوع آلية لتشغيل المهام. بالنسبة إلى Java ، يمكن تنفيذ خيوط متعددة بشكل متزامن في البرنامج ، ويمكن أن تعمل هذه الخيوط في وقت واحد على نظام متعدد المعالجات. عندما يتم تشغيل البرنامج كتطبيق ، يبدأ مترجم Java سلسلة رسائل للطريقة الرئيسية ().
2. بالتوازي والتزامن:
(1) التزامن: في نظام معالج واحد ، تشترك مؤشرات الترابط المتعددة في وقت وحدة المعالجة المركزية ، ونظام التشغيل مسؤول عن جدولة الموارد وتخصيصها لهم.
(2) التوازي: في نظام متعدد المعالجات ، يمكن للمعالجات متعددة تشغيل مؤشرات ترابط متعددة في نفس الوقت. يمكن أن تعمل هذه الخيوط في وقت واحد في نفس الوقت. على عكس التزامن ، يمكن فقط لمرواد متعددة مشاركة وقت وحدة المعالجة المركزية ، ويمكن تشغيل مؤشر ترابط واحد فقط في نفس الوقت.
3. إنشاء المواضيع:
(1) المفهوم الأساسي: كل مهمة في جافا هي كائن قابل للتشغيل. من أجل إنشاء مهمة ، يجب أولاً تحديد فئة المهام ، ويجب أن تنفذ فئة المهام الواجهة القابلة للتشغيل. والمواضيع هي في الأساس كائنات مريحة لتنفيذ المهمة. عملية تنفيذ مؤشر ترابط هي تنفيذ طريقة Run () في فئة المهام حتى النهاية.
(2) إنشاء مؤشرات ترابط من خلال الواجهة القابلة للتشغيل:
أ. حدد فئة المهام لتنفيذ واجهة RunNable ، وتنفيذ طريقة Run () في الواجهة القابلة للتشغيل (طريقة Run () تخبر مؤشر ترابط النظام كيفية التشغيل) ، وتحديد رمز المهمة المحدد أو معالجة منطق Run ().
ب. بعد تحديد فئة المهام ، قم بإنشاء كائن مهمة لفئة المهام.
ج. يجب تنفيذ المهمة في مؤشر ترابط ، وإنشاء كائن من فئة Tread ، وتمرير كائن الفئة المهمة التي تم إنشاؤها مسبقًا والتي تنفذ الواجهة القابلة للتشغيل إلى مُنشئ فئة Tread كمعلمة.
د. استدعاء طريقة START () لكائن فئة Tread وابدأ مؤشر ترابط. يتسبب في تنفيذ طريقة Run () للمهمة. عند تنفيذ طريقة Run () ، سينتهي مؤشر الترابط.
رمز المثال:
حزمة com.muzeet.mutithread ؛ // كل مهمة هي مثيل للواجهة القابلة للتشغيل. المهمة هي كائن قابل للتشغيل ، والمعلومات هو كائن يسهل تنفيذ المهمة. يجب عليك إنشاء فئة مهمة وتجاوز طريقة التشغيل لتحديد Task Public Class ThreadDemo1 التي تنفذ Runnable {private int countdown = 10 ؛ Override // إعادة كتابة طريقة التشغيل وتحديد المهمة العامة void run () {بينما العد التنازلي-> 0) {system.out.println ("$" + thread.currentThRead (). getName () + "(" + countdown + ")") ؛ }} // سيبدأ استدعاء طريقة البدء مؤشر ترابط ، مما يؤدي إلى استدعاء طريقة التشغيل في المهمة. بعد تنفيذ طريقة التشغيل ، ينهي مؤشر الترابط الرئيسي الفراغ الثابت العام (سلسلة [] args) {runnable demo1 = new threaddemo1 () ؛ Thread Thread1 = موضوع جديد (Demo1) ؛ Thread Thread2 = مؤشر ترابط جديد (Demo1) ؛ thread1.start () ؛ thread2.start () ؛ System.out.println ("Rocket Launch Countdown:") ؛ }}نتائج تشغيل البرنامج:
العد التنازلي لإطلاق الصواريخ: $ thread-0 (9) $ thread-0 (8) $ thread-0 (7) $ thread-0 (6) $ thread-0 (5) $ thread-0 (4) $ thread-0 (3) $ thread-0 (2) $ thread-0 (1) $ thread-0 (0)
قم بتشغيل كائنين مهمة في نفس الوقت:
public static void main (string [] args) {runnable demo1 = new threaddemo1 () ؛ RunNable Demo2 = new threaddemo1 () ؛ Thread Thread1 = موضوع جديد (Demo1) ؛ Thread Thread2 = مؤشر ترابط جديد (Demo2) ؛ thread1.start () ؛ thread2.start () ؛ System.out.println ("Rocket Launch Countdown:") ؛ }نتائج التشغيل:
العد التنازلي لإطلاق الصواريخ: $ thread-0 (9) $ thread-0 (8) $ thread-0 (7) $ thread-0 (6) $ thread-1 (9) $ thread-0 (5) $ thread-1 (8) $ thread-0 (4) $ thread-1 (7) $ thread-0 (3) $ thread-1 (6) $ thread-1 (5) $ thread-0 (2) $ thread-1 (4) $ thread-1 (3) $ thread-1 (2) $ thread-1 (1) $ thread-1 (0) $ thread-0 (1) $ thread-0 (0)
(3) ورث فئة الخيط لإنشاء مؤشر ترابط:
أ. أولا إنشاء فئة المهام يمتد فئة الموضوع. نظرًا لأن فئة مؤشرات الترابط تنفذ الواجهة القابلة للتشغيل ، فإن فئة المهمة المخصصة تنفذ أيضًا طريقة Runnable وطريقة Rerun () ، والتي تحدد رمز المهمة المحدد أو منطق المعالجة.
ب. قم بإنشاء كائن فئة Task ، والذي يمكنه استخدام مؤشر الترابط أو تشغيله كنوع متغير مخصص.
ج. استدعاء طريقة START () للكائن المخصص وابدأ مؤشر ترابط.
نموذج الرمز:
حزمة com.muzeet.mutithread ؛ // كل مهمة هي مثيل للواجهة القابلة للتشغيل. المهمة هي كائن قابل للتشغيل ، ويمكن لخيط تشغيل الكائن. يجب إنشاء فئة المهام ، ويجب تجاوز طريقة التشغيل لتحديد فئة المهمة العامة التي تمتد من فئة التمديد من Thourge Thread {private int countdown = 10 ؛ Override // أعد كتابة طريقة التشغيل وتحديد المهمة public void run () {بينما العد التنازلي-> 0) {system.out.println ("$" + this.getName () + "(" + countdown + ")") ؛ }} // سيبدأ استدعاء طريقة البدء مؤشر ترابط ، مما يؤدي إلى استدعاء طريقة التشغيل في المهمة. بعد تنفيذ طريقة التشغيل ، يقوم مؤشر الترابط بإنهاء الفراغ الثابت العام (سلسلة [] args) {extendfromthread thread1 = new ExtensFromThread () ؛ ExtendFromThread thread2 = new ExtendFromThread () ؛ thread1.start () ؛ thread2.start () ؛ System.out.println ("Rocket Launch Countdown:") ؛ }}نتائج التشغيل:
العد التنازلي لإطلاق الصواريخ: $ thread-0 (9) $ thread-0 (8) $ thread-0 (7) $ thread-0 (6) $ thread-0 (5) $ thread-0 (4) $ thread-0 (3) $ thread-0 (2) $ thread-0 (1) $ thread-0 (0) $ thread-1 (9) $ thread-1 (8) $ thread-1 (7) $ thread-1 (6) $ thread-1 (5) $ thread-1 (4) $ thread-1 (3) $ thread-1 (2) $ thread-1 (1) $ thread-1 (0)
ينتظر مؤشر ترابط واحد أن ينتهي مؤشر ترابط آخر قبل التنفيذ: عند تنفيذ مهمة PrintNum ، وعند طباعة الرقم 50 ، يتحول إلى تنفيذ مهمة طباعة حرف C ، ثم يستمر فقط في تنفيذ مهمة الطباعة بعد تنفيذ Thread4.
Package com.muzeet.testTherD ؛ الطبقة العامة printnum تنفذ runnable {private int lastnum ؛ printnum العامة (int n) {lastNum = n ؛ } Override public void run () {// todo method method method thread4 = new thread (new printchar ('c' ، 40)) ؛ thread4.start () ؛ حاول {for (int i = 1 ؛ i <= lastNum ؛ i ++) {system.out.println (""+i) ؛ if (i == 50) {thread4.join () ؛ }}} catch (InterruptedException e) {// todo catch catch e.printstacktrace () ؛ }}}4. مقارنة الطريقتين (أعيد طبعه)
أولاً ، نقوم بتحليل نتائج الإخراج للطريقتين. نحن أيضا إنشاء اثنين من المواضيع. لماذا النتائج مختلفة؟
باستخدام واجهة RunNable لإنشاء مؤشرات الترابط ، يمكنك مشاركة نفس الكائن الهدف (TreadDemo1tt = NewTreadDemo1 () ؛) ، وتنفيذ مؤشرات ترابط متطابقة متعددة لمعالجة نفس المورد. عندما يكمل مؤشر الترابط الأول المهمة ، يكون العد التنازلي هو 0 بالفعل ، وبالتالي فإن الموضوع الثاني لن يخرج. ورث طريقة إنشاء مؤشرات الترابط حسب مؤشر ترابط ، يتم إنشاء كائنين من فئة المهام ، مع متغيرات الأعضاء الخاصة بهما ، ولا تتداخل مع بعضها البعض.
ثم انظر إلى شرح من JDK:
يجب تنفيذ الواجهة القابلة للتشغيل بواسطة فئات تنوي تنفيذ مثيلاتها من خلال موضوع معين. يجب أن يحدد الفصل طريقة بدون معلمة تسمى Run.
الغرض من تصميم هذه الواجهة هو توفير بروتوكول عام للكائنات التي ترغب في تنفيذ التعليمات البرمجية عند النشاط. على سبيل المثال ، تنفذ فئة الخيط. التنشيط يعني أنه قد بدأ موضوع ولم يتوقف بعد.
بالإضافة إلى ذلك ، يوفر Runnable طريقة تنشيط للفئات التي ليست فئات فرعية من الخيط. من خلال إنشاء مثيل مؤشر ترابط وأخذ نفسه كهدف قيد التشغيل ، يمكنك تشغيل فئة تنفذ قابلة للتشغيل. في معظم الحالات ، إذا كنت ترغب فقط في تجاوز طريقة Run () وعدم تجاوز طرق مؤشر الترابط الأخرى ، فيجب عليك استخدام واجهة Runnable. هذا أمر مهم لأنه ما لم يكن المبرمج يعتزم تعديل أو تعزيز السلوك الأساسي للفصل ، فلا ينبغي إنشاء الفئة الفرعية لتلك الفئة. (يوصى باستخدام إنشاء فئة مهمة وتنفيذ الواجهة القابلة للتشغيل بدلاً من وراثة فئة مؤشر الترابط)
اعتماد ميراث فئة الخيط:
(1) المزايا: من السهل الكتابة. إذا كنت بحاجة إلى الوصول إلى مؤشر الترابط الحالي ، فلن تحتاج إلى استخدام طريقة thread.currentThread (). يمكنك الحصول على الموضوع الحالي مباشرة باستخدام هذا.
(2) العيوب: لأن فئة مؤشر الترابط قد ورثت فئة الخيط ، لا يمكن أن ترث فئات الوالدين الأخرى.
باستخدام طريقة واجهة Runnable:
(1) المزايا: فئات مؤشرات الترابط تنفذ فقط الواجهة القابلة للتشغيل ويمكنها أيضًا أن ترث فئات أخرى. وبهذه الطريقة ، يمكن لمؤشرات الترابط المتعددة مشاركة نفس الكائن الهدف ، لذلك من المناسب جدًا لخيوط متطابقة متعددة للتعامل مع نفس المورد ، بحيث يمكن فصل رمز وحدة المعالجة المركزية والبيانات لتشكيل نموذج واضح ، والذي يعكس بشكل أفضل الفكرة الموجهة للكائن.
(2) العيوب: البرمجة معقدة بعض الشيء. إذا كنت بحاجة إلى الوصول إلى مؤشر الترابط الحالي ، فيجب عليك استخدام Thread.CurrentThread ().
لخص
ما سبق هو كل شيء عن الطريقتين لإنشاء مؤشرات الترابط في أمثلة Java MultiThreading و Condual. آمل أن يكون ذلك مفيدًا للجميع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!