كيفية تنفيذ قطعة من التعليمات البرمجية فقط بعد انتهاء جميع المواضيع

StackOverflow https://stackoverflow.com/questions/1492069

  •  18-09-2019
  •  | 
  •  

سؤال

لدي رمز تسجيل يحتاج إلى تنفيذه بعد كل شيء Threadsيتم تنفيذ S.

Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();

doLogging();

هل هناك أي طريقة لتنفيذ doLogging() فقط بعد انتهاء كل من المواضيع مع معالجتها. الآن بعد ذلك doLogging() يسمى بمجرد بدء تشغيل T1 و T2.

هل كانت مفيدة؟

المحلول

فقط join() جميع المواضيع قبل الخاص بك doLogging() يتصل:

t1.join();
t2.join();

// the following line will be executed when both threads are done
doLogging();

لاحظ أن ترتيب join() لا يهم المكالمات إذا كنت ترغب في انتظار جميع المواضيع الخاصة بك.

نصائح أخرى

بالإضافة إلى حل الانضمام () هناك أيضا شيء يسمى العدو الدردية في مكتبة java.util.concurrent. يسمح لك بتهيئة رقم معين ثم انتظر حتى يصاب بالعدد المحدد في المرات.

مثال بسيط:

CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS);
for(int i=0; i<NUMBER_OF_THREADS;i++)
   new Thread(myCode).start();

latch.await();

يجب أن تضرب المزلاج صراحة من خلال مؤشرات ترابط العامل لهذا العمل على الرغم من:

latch.countDown()

إذا كنت تقوم بتشغيل التعليمات البرمجية من الخيط الرئيسي، ضع في اعتبارك أنه سيؤدي إلى تعليق واجهة المستخدم حتى تكتمل كل من المواضيع. هذا قد لا يكون التأثير المطلوب.

بدلا من ذلك، يمكنك التفكير في البناء حيث يتزامن كل مؤشر ترابط Logger الاعتراض وأداء المكالمات إليها داخل هذا البناء. نظرا لأنني لا أعرف ما الذي تحاول تحقيقه على وجه التحديد، فإن الحل الآخر هو ما joachim. اقترح، فقط وضع هذا الرمز داخل مؤشر ترابط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top