شرح مفصل وأمثلة من Java Thread Sleep () وانتظر ()
ينام
1.Sleep هو طريقة ثابتة للخيط. يتيح هذا الخيوط التي تم تنفيذها بواسطة Runnable لاستخدام طريقة النوم. كما أنه يتجنب استدعاء طريقة Sleep () لبعضها البعض قبل أن تتسبب المواضيع في تسبب الجمود.
2. النوم () يجب إعطاء وقت للنوم عند التنفيذ. أثناء النوم (أثناء حظر الخيط) ، ستتخلى وحدة المعالجة المركزية عن هذا الموضوع وتؤدي مهام أخرى. عندما ينتهي وقت النوم ، سيستيقظ الخيط تلقائيًا ، ولكن لن يتم تنفيذ الخيط على الفور ، ولكنه سينتظر حتى يتم تخصيص موارد وحدة المعالجة المركزية للتنافس مع مؤشرات الترابط الأخرى.
3. بالإضافة إلى ذلك ، إذا كان هذا الموضوع يكتسب قفلًا من قبل ، فلن يتم إصدار القفل أثناء النوم. يجب أن تنتظر البرامج الأخرى التي تنتظر قفل الجهاز حتى يستيقظ هذا الموضوع وتشغيله بعد التنفيذ.
الكود المرتبط بالنوم
الفئة العامة threadtest2 {public static void main (string [] args) {system.out.println ("ابدأ اختبارنا") ؛ ThreadSleep Sleep = new threadsleep () ؛ جرب {thread thread1 = new thread (sleep ، "passer a") ؛ Thread Thread2 = موضوع جديد (النوم ، "المارة B") ؛ thread1.start () ؛ thread2.start () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println ("الاختبار انتهى") ؛ }} class threadsleep تنفذ runnable {int count = 0 ؛ Override public void run () {system.out.println (thread.currentThread (). getName () + "say: hello sleep !!") ؛ عدد()؛ } public void count () {when (count <20) {system.out.println (thread.currentThRead (). getName () + "say: count is" + count) ؛ حاول {count ++ ؛ thread.sleep (100) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}}سجل الإخراج
ابدأ اختبار اختبارنا قد انتهى من Passerby A. Passerby A يقول: العد هو 0 Passerby B يقول: مرحبا النوم !! يقول المارة ب: العد هو واحد من المارة أ. يقول المارة B: Count Is 14 Passerby A يقول: Count Is 14 Passerby A يقول: Count Is 16 Passerby B يقول: Count Is 16 Passerby A SEALH: COUNT IS 18 Passerby B يقول: Count is 18
من خلال السجل ، يمكننا أن نجد أن الخيط A والموضوع B يتم تنفيذهان بشكل أساسي بالتناوب ، لكنهما غير منتظمان ولديهما مشاكل في التزامن.
هذا الموقف يرجع إلى أن الكود يحدد وقت النوم إلى 100 ميلي ثانية. نظرًا لأن زيادة سرعة التنفيذ تكون سريعة للغاية ، فإن الخيط ينام تقريبًا في نفس الوقت ، ثم يستيقظ في نفس الوقت ويؤدي إلى حدوث التزامن.
بعد ذلك ، تحتاج إلى إضافة كتلة المزامنة للتحقق مما إذا كان قد تم إطلاق قفل توقيت النوم
الفئة العامة threadtest2 {public static void main (string [] args) {system.out.println ("ابدأ اختبارنا") ؛ ThreadSleep Sleep = new threadsleep () ؛ جرب {thread thread1 = new thread (sleep ، "passer a") ؛ Thread Thread2 = موضوع جديد (النوم ، "المارة B") ؛ thread1.start () ؛ thread2.start () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println ("الاختبار انتهى") ؛ }} class threadsleep تنفذ runnable {int count = 0 ؛ Override public void run () {system.out.println (thread.currentThread (). getName () + "say: hello sleep !!") ؛ عدد()؛ } count public void count () {بينما count <20) {synchronized (this) {system.out.println (thread.currentTherAd (). getName () + "say: count is" + count) ؛ حاول {count ++ ؛ thread.sleep (100) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}}}}سجل الإخراج
ابدأ اختبار المارة A SEAN A: مرحبًا نوم !! Passerby A يقول: Count Is 0test قد انتهى المارة B يقول: مرحبًا النوم !! يقول المارة A: العد هو واحد من المارة A يقول: Count is is 2 passerby A sealle: count is 3 passerby a sealh: count is 4 passerby a sealh: count is 5 passerby a sealh: count is 6 passerby a say 13-PASSER A: Count Is 14-Passer A SEHEN: Count Is 15-Passer MAIN: Count Is 16-Passer يقول: Count Is 17-Passer MAIN: Count Is 18-Passer MAIN: Count Is 19-Passer Beain: Count Is 20
يمكن أن نرى من السجل الذي يتم تنفيذه بشكل أساسي. هذا لأنه أثناء النوم ، يكون قفل الماكينة دائمًا على الموضوع A ، لذلك لا يمكن للموضوع B الانتظار إلا حتى يطلق الخيط A القفل.
انتظر
1.wait () هي طريقة لفئة الكائن. عندما يتم استدعاء طريقة Wait () ، يدخل مؤشر الترابط إلى تجمع الانتظار المرتبط بالكائن ويطلق القفل الذي يحتوي عليه.
2. بعد تنفيذ WAIT () ، يجب عليك استخدام طريقة الإخطار () أو طريقة الإخطار () أو تعيين وقت الانتظار (الانتظار (وقت طويل)) لإيقاظ الخيط في تجمع مؤشر ترابط الانتظار.
3. يجب وضع wait () في الكتلة المتزامنة ، وإلا سيتم الإبلاغ عن استثناء "java.lang.illegalmonitorstateException" في وقت التشغيل.
الرمز المتعلق بالانتظار
الفئة العامة threadtest2 {public static void main (string [] args) {system.out.println ("ابدأ اختبارنا") ؛ ThreadSleep Sleep = new threadsleep () ؛ جرب {thread thread1 = new thread (sleep ، "passman a") ؛ Thread Thread2 = موضوع جديد (النوم ، "Passman B") ؛ thread1.start () ؛ thread2.start () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println ("الاختبار انتهى") ؛ }} class threadsleep تنفذ runnable {int count = 0 ؛ Override public void run () {system.out.println (thread.currentThread (). getName () + "say: hello sleep !!") ؛ عدد()؛ } count public void count () {بينما count <20) {synchronized (this) {system.out.println (thread.currentTherAd (). getName () + "say: count is" + count) ؛ حاول {count ++ ؛ this.ait (100) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}}}}سجل الإخراج
ابدأ اختبار المارة A SEAN A: مرحبًا نوم !! Passerby A يقول: Count Is 0test قد انتهى المارة B يقول: مرحبًا النوم !! يقول المارة ب: العد هو واحد من المارة أ. يقول المارة B: Count Is 14 Passerby A يقول: Count Is 15 Passerby B يقول: Count Is 16 Passerby A يقول: Count Is 17 Passerby B يقول: Count Is 18 Passerby يقول: Count is 19
من خلال السجل ، يمكن العثور على أنه في حالة الانتظار ، سيتم إصدار القفل.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!