لنفترض أن هناك موضوعين يعملان بشكل متزامن ، ويحتوي الرمز الذي تم تنفيذه بواسطة مؤشر ترابط واحد على حلقة ميتة مثل: بينما (صحيح) ... عندما ينفذ مؤشر الترابط الكود في (True) ، هل سيكون لخيط آخر فرصة للتنفيذ؟
نموذج الرمز (الرمز ينبع من الإنترنت)
خدمة الفئة العامة {Object1 = new Object () ؛ public void methoda () {synchronized (object1) {system.out.println ("methoda begin") ؛ منطقية isContinuerUn = صواب ؛ // تنفيذ حلقة ميتة هنا بينما (isContinuerun) {} system.out.println ("Methoda end") ؛ }} object2 = new Object () ؛ public void methodb () {synchronized (object2) {system.out.println ("methodb begin") ؛ System.out.println ("MethodB End") ؛ }}} تنفيذ فئتي الخيوط هو كما يلي:
استيراد Service.Service ؛ يمتد الفئة العامة Threada Thread {خدمة الخدمة الخاصة ؛ public threada (خدمة الخدمة) {super () ؛ this.service = الخدمة ؛ } Override public void run () {service.methoda () ؛ }} الموضوع A ينفذ methoda () ، وهناك حلقة ميتة في Methoda ()
استيراد Service.Service ؛ فئة Public Threadb يمتد Thread {Service Service Service ؛ threadb العامة (خدمة الخدمة) {super () ؛ this.service = الخدمة ؛ } Override public void run () {service.methodb () ؛ }}الموضوع B ينفذ methodb (). عندما يدخل الخيط A إلى حلقة Dead in Methoda () ، هل يمكن أن ينفذ الموضوع B ويكمله؟
فئة الاختبار
import service.service ؛ import extthread.threada ؛ import extThread.ThreadB ؛ class public Run {public static void main (string [] args) {service service = new service () ؛ threada athroad = new threada (service) ؛ Athread.start () ؛ threadb bthread = new threadb (service) ؛ bthread.start () ؛ }}نظرًا لأن قفل الكائن الذي تم الحصول عليه بواسطة مؤشر الترابط A و Thread B ليسا نفس القفل ، يمكن رؤيته من النتيجة التي يمكن تنفيذها وإكمالها. نظرًا لأن الخيط A يدخل في حلقة Dead ، فإن Thread A يستمر في التنفيذ وتشغيله (لم ينتهي البرنامج بأكمله) ، ولكن سينتهي الموضوع B.
هذا هو ، على الرغم من أن الموضوع A يتم تنفيذه دائمًا في حين ، إلا أنه يحتاج إلى تناول وحدة المعالجة المركزية. ومع ذلك ، فإن جدولة مؤشرات الترابط هي مسؤولية JVM أو نظام التشغيل. هذا لا يعني أن الخيط A يحلق باستمرار أثناء وجوده ، ثم لن يشغل الخيط B وحدة المعالجة المركزية. بالنسبة للموضوع A ، فإنه يعادل وظيفة "كثيفة الحساب". إذا كانت حلقةنا تختبر باستمرار ما إذا كانت حالة معينة صحيحة ، فإن هذه الطريقة هي مضيعة لوحدة المعالجة المركزية. يمكنك الرجوع إلى مثال محدد: "طريقة الاتصال بين الخيوط" في طريقة الاتصال بين مؤشرات الترابط من Java Multi-throwd-thromed Java من "طريقة الاتصال بين الخيوط" النقطة الثانية أثناء الاقتراع.
إذا تم تعديل Service.java على النحو التالي:
خدمة الفئة العامة {// object1 = new Object () ؛ public void methoda () {synchronized (this) {system.out.println ("methoda begin") ؛ منطقية isContinuerUn = صواب ؛ // تنفيذ حلقة ميتة هنا بينما (isContinuerun) {} system.out.println ("Methoda end") ؛ }} // object2 = new Object () ؛ public void methodb () {synchronized (this) {system.out.println ("methodb begin") ؛ System.out.println ("MethodB End") ؛ }}}إذا كان مؤشر الترابط A يحصل على قفل الكائن أولاً ، يكون مؤشر الترابط A دائمًا في حلقة أثناء الحلقة. لا يمكن لتنفيذ Thread B تنفيذ MethodB () لأنه لا يمكن الحصول على القفل.
يمكن أن نرى أنه إذا لم يتمكن مؤشر ترابط واحد من الخروج في الطريقة المتزامنة ولا يمكنه إطلاق القفل ، فيمكن أن ينتظر الخيط الآخر بلا حدود.
ما سبق هو كل شيء عن هذا المقال. آمل أن يكون من المفيد للجميع تعلم جافا multithreading.