هناك طريقتان لإنشاء مؤشرات ترابط في Java ، وهما ورث فئة الخيط وتنفيذ الواجهة القابلة للتشغيل.
روث الخيط
الفئة العامة myThread يمتد الموضوع {public mythread (اسم السلسلة) {super (name) ؛ } int i ؛ public void run () {for (i = 0 ؛ i <5 ؛ i ++) {system.out.println (getName ()+"-"+i) ؛ }} public static void main (string [] Agrs) {new MyThread ("thread1"). start () ؛ new MyThread ("thread2"). start () ؛ }} /*thread 1-0thread 1-1thread 1-2thread 1-3thread 1-4thread 2-0thread 2-1thread 2-2thread 2-3thread 2-4* /كما ذكر أعلاه ، يجب إنشاء كائنات مؤشر الترابط في Java في شكل فئة ، ويجب تجاوز طريقة Run () للفئة الأساسية في هذه الفئة. هذه الطريقة هي في الواقع هيئة تنفيذ الخيط. استدعاء طريقة البدء في مثيل الفئة هذا يتصل ضمنيًا طريقة التشغيل.
ليس من الصعب أن نرى أنه نظرًا لأن MyThread كان جديدًا مرتين ، فإن أمثلة المرتين مختلفة ، أي أن لكل منهما متغيرات I الخاصة به ، وهي مستقلة عن بعضها البعض.
واجهة Runnable
الطبقة العامة myrunnable الأدوات runnable {int i ؛ public void run () {for (i = 0 ؛ i <50 ؛ i ++) {system.out.println (thread.currentThread (). getName ()+"-"+i) ؛ // this.getName () لا يمكن استخدامه مباشرة}} موضوع جديد (Myrun ، "thread1"). start () ؛ موضوع جديد (Myrun ، "thread2"). start () ؛ }} /*thread 1-0thread 1-1Thread 2-0thread 2-3thread 2-4thread 2-5thread 2-6thread 2-7thread 2-8th Thread 2-9th Thread 2-16th Thread 2-18 Thread 2-2TH Thread 2-2TH Thread 2-2TH Thread 2-2TH Thread 2-20 Thread 2-20 Thread 2-20 Thread 2-20 Thread 2-20 Thread 2-20 2-22th Thread 2-23th Thread 2-24th Thread 1-17th Thread 2--25 Threads 1--26 Threads 2–27 Threads 1--28 Threads 1--3 2--40 Threads 1--42 Threads 1--44 Threads 1--45 Threads 2–43 Threads 1--46 Threads 2–47 Threads 2–49 Threads 1--48*/يمكن ملاحظة أنه نظرًا لأن هذه الطريقة هي تحميل كائن في فئة مؤشرات الترابط كهدف ، حتى لو كان هناك العديد من كائنات مؤشرات الترابط في جديدة ، طالما أن الهدف هو نفس كائن المرجع ، يتم استدعاء طريقة تشغيل الكائن ، وتشارك جميع مؤشرات الترابط في موارد الكائن الهدف. لذلك ، سترى أن الخيط 1 والخيط 2 يخرجان ما مجموعه 51 مرة ، وقد أكمل الخيطان الإخراج من I من 0 إلى 49 ، ولا يخرجان 5 مرات على التوالي كما هو موضح أعلاه. أما بالنسبة للسبب في أن 51 مخرجات ، فإن الخيطين يدخلان الحالة الجاهزة تقريبًا في نفس الوقت تقريبًا (تتيح طريقة البدء فقط للمعلومات الدخول إلى الحالة الجاهزة) ، فليس من الصعب العثور على أنه عندما يكوني يساوي 0 ، فإن الخيط 1 والخيط 2 في الحالة الجارية في نفس الوقت ، مما يؤدي إلى ظاهرة التوافق ، وإخراج I = 0 معًا. بعد ذلك ، تقوم وحدة المعالجة المركزية باستمرار بتبديل مؤشرات الترابط ، بحيث يتم إخراج مؤشر ترابط واحد فقط في نفس الوقت.
حالة الموضوع
تنقسم المواضيع إلى 4 ولايات
حالة جاهزة: اتصل بالطريقة البدء وأدخل الحالة الجاهزة.
حالة التشغيل: سيتم جدولة الخيط في الحالة الجاهزة بواسطة JVM وتصبح حالة الجري.
حالة الحظر: إذا لم ترد بعض أساليب التزامن النتائج ، أو تحدث حالة حظر ، أو نوم و yeild.
حالة الوفاة: يتم تنفيذ هيئة الأسلوب أو إجبار الخيط على التوقف.
العمليات الأساسية للمواضيع
انضم () لدمج مؤشر ترابط: بعد استدعاء مؤشر الترابط الحالي طريقة Join of Thread ، سينتظر حتى إكمال مؤشر الترابط قبل أن يستمر مؤشر الترابط.
النوم (مللي ثانية طويلة) نوم الخيط: يمنع الخيط الحالي ، وسيستمر فقط عند ارتفاع وقت الحظر. عند الحظر مرة أخرى ، سيتم تسليم ملكية وحدة المعالجة المركزية إلى خيوط أخرى ، لذلك غالبًا ما يتم استخدام النوم (1) لتبديل المواضيع.
** امتيازات العائد () مؤشر الترابط: ** يشبه yeild النوم ، ولكنه لن يتنازل فقط إلى خيوط أخرى على مستوى أعلى أو في نفس المستوى. إذا لم تكن خيوط أخرى أقل من مستوىها ، فسيتم تنفيذ الخيط مرة أخرى.
موضوع الخلفية
بعد تنفيذ البرنامج بواسطة نظام التشغيل ، ستكون هناك عملية ، وعملية تحتوي على مؤشر ترابط واحد على الأقل (مؤشر ترابط رئيسي). لا يحتوي الخيط الرئيسي على العديد من الميزات الخاصة من مؤشرات الترابط الأخرى ، لمجرد أنه هو أول مؤشر ترابط يتم تنفيذه ، وسيتم إنشاء مؤشرات ترابط أخرى في الخيط الرئيسي. إذا لم يتم تحديدها ، يتم إنشاء مؤشر الترابط الأمامي (بما في ذلك الخيط الرئيسي) افتراضيًا. إذا تم استدعاء setDaemon (صحيح) ، يتم تعيين مؤشر الترابط بشكل صريح كخيط خلفية. خيط الخلفية هو موضوع خفي. كما ترون من الاسم ، فإن وظيفتها الرئيسية هي توفير وظائف الوصي والخدمة للمواضيع الأخرى. عندما تنتهي جميع المواضيع الأمامية ، سيتم إجبار مؤشر ترابط الخلفية على النهاية لأنه لا يوجد معنى في هذا الوقت.
خيط المقدمة
فئة عامة foreandbackThread يمتد الموضوع {public foreandbackThread (اسم السلسلة) {super (name) ؛ } public void run () {int i ؛ لـ (i = 0 ؛ i <9999 ؛ i ++) {system.out.println (this.getName ()+"-"+i) ؛ }} public static void main (string [] args) {foreAndbackThread th = new ForeAndBackThread ("thread a") ؛ //th.setdaemon(true) ؛ th.start () ؛ int j ؛ لـ (j = 0 ؛ j <3 ؛ j ++) {system.out.println (thread.currentThRead (). getName ()+"-"+j) ؛ }}}خيط الطفل الإخراج الكامل للبرنامج هو من 0 إلى 9998 ؛ وهذا يعني أن الخيط الرئيسي ليس خاصًا ، ولن يؤثر نهايته على تشغيل الخيوط الأمامية الأخرى.
موضوع الخلفية
فئة عامة foreandbackThread يمتد الموضوع {public foreandbackThread (اسم السلسلة) {super (name) ؛ } public void run () {int i ؛ لـ (i = 0 ؛ i <9999 ؛ i ++) {system.out.println (this.getName ()+"-"+i) ؛ }} public static void main (string [] args) {foreAndbackThread th = new ForeAndBackThread ("thread a") ؛ th.setdaemon (صواب) ؛ th.start () ؛ int j ؛ لـ (j = 0 ؛ j <3 ؛ j ++) {system.out.println (thread.currentThRead (). getName ()+"-"+j) ؛ }}}لا يمكن للبرنامج إخراج 0-9998 بالكامل ويخرج ، مما يشير إلى أنه بعد الخيط الرئيسي للهائم المقدمة ، يفرض JVM سلسلة الخلفية على النهاية.
لخص
ما سبق هو كل شيء عن تحليل الأمثلة الأساسية لخيوط Java في هذه المقالة ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!