كيفية تنفيذ قطعة من التعليمات البرمجية فقط بعد انتهاء جميع المواضيع
-
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. اقترح، فقط وضع هذا الرمز داخل مؤشر ترابط.