الانضمام حرفيا يعني الانضمام. دعنا نلقي نظرة على شرح وتنفيذ طريقة الانضمام.
/*** ينتظر أن يموت هذا الموضوع. * يقوم مؤشر ترابط المتصل (مؤشر الترابط الذي يستدعي طريقة JOIN) بإجراء عملية انتظار حتى ينتهي مؤشر الترابط المسمى (The Method the Join Method) ويتم استيقاظه مرة أخرى * <p> يتصرف الاحتجاج بهذه الطريقة بنفس الطريقة التي يتصرف بها بنفس الطريقة التي يتصرف بها invocation * * * @Throws interruptedException * إذا كان أي مؤشر ترابط يقطع مؤشر الترابط الحالي. يتم مسح الحالة * <i> المقاطعة </i> من مؤشر الترابط الحالي * عند إلقاء هذا الاستثناء. */ public final void join () remrows interruptedException {Join (0) ؛ }هنا يسمى الانضمام
/** * ينتظر على الأكثر {code millis} ملايين ثانية لهذا الموضوع إلى * يموت. يعني مهلة {Code 0} انتظار تنفيذ مؤشر الترابط ، أو قد وصل الحد الأقصى لوقت الانتظار المحدد ، ويتم إيقاظ سلسلة المتصل مرة أخرى. إذا كان الحد الأقصى لوقت الانتظار هو 0 ، فيمكنك الانتظار فقط حتى ينتهي تنفيذ مؤشر الترابط قبل أن تتمكن من الاستيقاظ. * <p> يستخدم هذا التنفيذ حلقة من {code this.wait} المكالمات * مشروط على {code this.isalive}. نظرًا لإنهاء سلسلة الرسائل ، يتم استدعاء طريقة * {code this.notifyall}. يوصى بعدم استخدام التطبيقات {code wait} أو {code notify} أو * {code notifyall} على {code thread} مثيلات. * * *// public final void join (long millis) رميات interruptedException {long base = system.currentTimeMillis () ؛ طويل الآن = 0 ؛ if (millis <0) {رمي New IllugalArgumentException ("قيمة المهلة سلبية") ؛ } if (millis == 0) {while (isalive ()) {wait (0) ؛ }} آخر {بينما (isalive ()) {long delay = millis - الآن ؛ if (تأخير <= 0) {break ؛ } انتظر (تأخير) ؛ الآن = system.currentTimeMillis () - قاعدة ؛ }}} يمكن ملاحظة أن طريقة الانضمام نفسها تنفذ من خلال طريقة الانتظار. يُحكم هنا أنه إذا كان الخيط لا يزال قيد التشغيل ، فاستمر في الانتظار. إذا كان الوقت المحدد قد حان ، أو أن يكون مؤشر الترابط تشغيله ، يستمر الكود في التنفيذ لأسفل ، ويمكن لخيط الاتصال تنفيذ المنطق اللاحق.
لكن هنا لا أرى مكان الاتصال بالطريقة الإخطار أو الإخطار. إذا لم يتم استدعاؤه ، فسيستمر مؤشر ترابط المتصل في الانتظار. أين طريقة استيقاظها؟ من خلال التحقق ، وجد أنه عندما انتهى الخيط ، قام الجهاز الظاهري Java بتنفيذ طريقة الخروج المحلية للمعلومات.
// وظيفة خروج الموضوع: void javathread :: exit (bool destroy_vm ، exittype exit_type) {... // سوف يتعامل هذا قفل ObjectLocker (ThreadObj ، موضوع) ؛ Thread-> clear_pending_exception () ؛ java_lang_thread :: set_thread_status (ThreadObj () ، java_lang_thread :: inital) ؛ java_lang_thread :: set_thread (threadobj () ، null) ؛ // هنا نسمي طريقة الإخطار لإيقاظ قفل مؤشر ترابط الانتظار. notify_all (موضوع) ؛ Thread-> clear_pending_exception () ؛ }هذا سوف يفهم متى يتم إيقاظ الموضوع. دعنا نكتب مثالًا أدناه لرؤية التأثير.
الفئة العامة المفصل {public static void main (string [] args) {threadboy boy = new threadboy () ؛ boy.start () ؛ } static class threadboy يمتد thread {Override public void run () {system.out.println ("Boy and Girl مستعدون للذهاب للتسوق") ؛ threadgirl girl = new threadgirl () ؛ girl.start () ؛ حاول {girl.join () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("The Boy and the Girl STANT FROPECT") ؛ }} static class threadgirl يمتد مؤشر الترابط {Override public void run () {int time = 5000 ؛ System.out.println ("الفتاة تبدأ في وضع المكياج ، ينتظر الصبي ...") ؛ حاول {thread.sleep (time) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("تم الانتهاء من الفتاة بالمكياج! ، الوقت المستغرق" + الوقت) ؛ }}}} نتيجة التنفيذ هي:
الصبي والفتاة يخرجون من التسوق وتبدأ الفتاة في وضع المكياج ، ينتظر الصبي. . .
تم الانتهاء من مكياج الفتاة! ، 5000
بدأ الصبي والفتاة في التسوق
الصبي والفتاة سوف يذهبون للتسوق. تحتاج الفتاة إلى وضع المكياج أولاً. بعد أن تنتهي الفتاة من المكياج ، ستذهب للتسوق معًا.
إذن ما هو استخدام Join (الوقت)؟
الفئة العامة المفصل {public static void main (string [] args) {threadboy boy = new threadboy () ؛ boy.start () ؛ } static class threadboy يمتد thread {Override public void run () {system.out.println ("Boy and Girl مستعدون للذهاب للتسوق") ؛ threadgirl girl = new threadgirl () ؛ girl.start () ؛ الوقت int = 2000 ؛ حاول {girl.join (time) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("The Boy Waited" + time + "، لا أريد الانتظار لفترة أطول ، أذهب للتسوق") ؛ }} static class threadgirl يمتد مؤشر الترابط {Override public void run () {int time = 5000 ؛ System.out.println ("بدأت الفتاة في وضع المكياج ، كان الصبي ينتظر ...") ؛ حاول {thread.sleep (time) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("انتهت الفتاة من صنع! ، الوقت المستغرق" + الوقت) ؛ }}} هنا ، يتم استبدال طريقة الانضمام فقط بطريقة Join (الوقت). تم تغيير الوصف ، ونتيجة الطباعة هي:
الصبي والفتاة يخرجون من التسوق وتبدأ الفتاة في وضع المكياج ، ينتظر الصبي. . .
انتظر الصبي 2000 ، ولم يرغب في الانتظار لفترة أطول. ذهب التسوق وانتهت الفتاة على وضع المكياج! ، 5000
انتظر الصبي الوقت في الانضمام (الوقت). إذا لم يتم تنفيذ الخيط الذي كانت فيه الفتاة بعد وصول هذا الوقت ، فلن ينتظر وقتًا بعد الآن ويستمر في تنفيذ المنطق اللاحق ، لمجرد التسوق بنفسه دون انتظار الفتاة.
من هذا يمكننا أن نرى أن طريقة الانضمام هي تحقيق التنفيذ المتزامن لخيطين أكثر ملاءمة. الموضوع 1 ينفذ. بعد مواجهة الموضوع 2 ، انتظر لتنفيذ الموضوع 2 ، ثم تابع تنفيذ تنفيذ مؤشر الترابط 1. معنى الانضمام الآن أكثر بصرية.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.