مقدمة:
أثار الاختبار الأسبوع الماضي خطأً في الوحدة النمطية التي طورها زملاء التطوير ، وكان لا يزال صدفة.
بعد التحقق من الكود بعناية ، وجدت أن Trathreading يتم تمكينه في العمل ، ويتم تشغيل مؤشر ترابط 2 في نفس الوقت ، ولكن يجب أن يضمن الخيط الذي بدأ حديثًا أن يتم إكمال أحدهما والآخر في العمل للتخلص من الخلل.
متى تستخدمه؟
يتم استخدام Multithreading في العديد من الأماكن ، ولكن إذا أردنا بدء تشغيل مؤشر ترابط آخر بعد اكتمال مؤشر ترابط معين ، يمكن أن يكون CountDownlatch مفيدًا.
كيف تستخدمه؟
دعنا نلقي نظرة على الكود المتعدد المتورات العادي:
رمز الحزمة ؛ الفئة العامة myThread يمتد Thread {public static void main (string [] args) {mythread th = new MyThread () ؛ الموضوع T1 = موضوع جديد (Th ، "MyThread") ؛ t1.start () ؛ System.out.println (thread.currentThRead (). getName ()) ؛ } public void run () {mythread1 th2 = new MyThread1 () ؛ الموضوع T2 = موضوع جديد (Th2 ، "MyThread1") ؛ t2.start () ؛ System.out.println (this.currentThread (). getName ()) ؛ } class myThread1 يمتد Thread {public void run () {try {thread.sleep (1000) ؛ } catch (interruptedException e) {// todo catch catch e.printstacktrace () ؛ } system.out.println (this.currentThRead (). getName ()) ؛ }}}الرمز كما هو مذكور أعلاه. أولاً ، استخدم myThread لروث فئة الخيوط ، ثم اكتب فئة MyThread1 أخرى داخل فئة MyThread ، والتي ترث أيضًا فئة الخيط ، وتتيح للنوم لمدة ثانية واحدة في طريقة التشغيل. وبهذه الطريقة ، سيتم طباعة الرمز:
من ترتيب الإخراج أعلاه ، يمكننا أن نرى أن الخيط الرئيسي قد تم تشغيله لأول مرة ، ثم يتم تشغيل مؤشر ترابط MyThread. في موضوع MyThread ، يتم تشغيل موضوع MyThread1. ومع ذلك ، نظرًا لأن موضوع MyThread1 ينام لمدة ثانية واحدة ، فقد قام بمحاكاة معالجة الأعمال اللاحقة ، لذلك سيكون متأخراً بقليل من الانتهاء من MyThread.
الآن ، أضف CountDownlatch إلى الكود ، واترك MyThread1 يعمل أولاً ، ثم دع MyThread يستمر في التشغيل.
رمز الحزمة ؛ استيراد java.util.concurrent.countdownlatch ؛ فئة MyThread العامة يمتد Thread {countDownLatch CountDownLatch = new CountDownLatch (1) ؛ public static void main (string [] args) {mythread th = new MyThread () ؛ الموضوع T1 = موضوع جديد (Th ، "MyThread") ؛ t1.start () ؛ System.out.println (thread.currentThRead (). getName ()) ؛ } public void run () {mythread1 th2 = new MyThread1 () ؛ الموضوع T2 = موضوع جديد (Th2 ، "MyThread1") ؛ t2.start () ؛ حاول {countDownLatch.await () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println (this.currentThRead (). getName ()) ؛ } class myThread1 يمتد Thread {public void run () {try {thread.sleep (1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println (this.currentThRead (). getName ()) ؛ CountDownlatch.countdown () ؛ }}}يتم عرض طريقة كتابة التعليمات البرمجية أعلاه ، مقسمة تقريبًا إلى ثلاث خطوات
1. دعنا أول معلمة كائن CountDownlatch الجديدة التي تم تعيينها على 1 (أفهم شخصياً أن هذا يشبه صفيفًا جديدًا. عندما يتم مسح الصفيف ، يمكن أن يستمر الخيط المقطع في التشغيل)
2. استدعاء countdownlatch.await () في فئة mythread ؛ للتوقف عن تشغيل الموضوع الحالي.
3. اتصل بالطريقة العددية. عندما يتم تنفيذ جميع myThread1 ، ويتم استدعاء الطريقة أخيرًا ، فإن الوظيفة هي مسح "الصفيف" الذي ذكرته.
تحقق من نتائج الطباعة للإخراج
النتائج كما هو موضح في الشكل أعلاه ، والتي تتماشى مع النتائج المتوقعة.
أخيرًا ، دعنا نتحدث عن CountDownlatch CountDownLatch = New CountDownLatch (1). تعيين 1 في هذا المجال ، لذلك تحتاج إلى استدعاء CountDownlatch.countdown () مرة واحدة لطرح 1.
إذا كان رقمًا آخر ، فيجب استدعاء العدد المقابل من المرات ، وإلا فلن يتم تنفيذ ترابط الاتصال countDownlatch.await ().
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.