في برامج Java، هناك حالات يتم فيها تنفيذ سلسلة المحادثات بسرعة كبيرة جدًا أو يحتاج البرنامج إلى التبديل إلى سلسلة رسائل أخرى. للقيام بذلك، تحتاج إلى تعليق تنفيذ مؤشر الترابط الحالي. في Java، يمكن القيام بذلك باستخدام طريقة java.lang.Thread.sleep() .
طريقة Thread.sleep()
فئة Thread موجودة في حزمة Java.lang وتحتوي على طريقة Thread.sleep() . يتم استخدام طريقة Java.lang.thread Sleep() لتعليق مؤشر الترابط الحالي لفترة زمنية محددة بالمللي ثانية. إذا نظرت إلى مستندات Oracle ، فستجد أن هناك طريقتين للنوم () مثقلتين بفئة Thread .static void sleep(long millis)
حيث الميلي هو الوقت بالمللي ثانية. تؤدي هذه الطريقة إلى دخول مؤشر الترابط الذي يتم تنفيذه حاليًا في وضع السكون (إيقاف التنفيذ مؤقتًا، "السكون") لمدة مللي ثانية، اعتمادًا على دقة مؤقتات النظام والمجدولين. لا يمكن أن تكون قيمة الوسيطة للميلي ثانية سالبة. إذا كان الأمر كذلك، فسيتم طرح IllegalArgumentException .
static void sleep(long millis, int nanos)
حيث يطحن الوقت بالمللي ثانية والنانو هو الوقت بالنانو ثانية. يتم استخدام هذا النوع من الطريقة لتعليق تنفيذ مؤشر الترابط الحالي للوقت المحدد بالمللي ثانية والنانو ثانية. قيمة النانو ثانية صالحة بين 0 و999999. لنقم بإنشاء برنامج بسيط يستخدم طريقة Thread.sleep() لإيقاف تنفيذ الخيط الرئيسي مؤقتًا لمدة 5 ثوانٍ:
public class SleepDemo {
public static void main(String[] args) throws InterruptedException {
//the current time in milliseconds
long start = System.currentTimeMillis();
// stop the main thread of the program for 5000 milliseconds (5 seconds)
Thread.sleep(5000);
System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " milliseconds");
}
}
ماذا يحدث في هذا البرنامج؟ يبدأ أولاً، ثم ينام لمدة 5 مللي ثانية (5 ثوانٍ)، ثم يطبع رسالة على وحدة التحكم حول مدة تجميده، ثم يخرج. الإخراج هو:
تم إيقاف مؤشر الترابط مؤقتًا لمدة 5008 مللي ثانية
كما ترون، لم يتوقف البرنامج لمدة 5 ثوان، ولكن لفترة أطول قليلا. أيضًا إذا قمت بتشغيل البرنامج على جهاز الكمبيوتر الخاص بك، ستلاحظ أنه من الممكن أن يوقف تنفيذ الخيط لمدة أطول من 5000 مللي ثانية وليس ضروريًا لمدة 5008 مللي ثانية. والحقيقة هي أن كل هذا يتوقف على نظام التشغيل والتنفيذ المحدد لجدولة الخيط. بمزيد من التفاصيل، يعتمد الوقت الفعلي الذي ينتظره الخيط قبل التنبيه وبدء التنفيذ على مؤقتات النظام والمجدولين. بالنسبة للنظام الهادئ، يكون وقت النوم الفعلي قريبًا من وقت النوم المحدد، ولكن بالنسبة للنظام المحمل سيكون أطول قليلاً. تُستخدم هذه الطريقة غالبًا في سلاسل الرسائل الفرعية عندما تحتاج إلى القيام ببعض الإجراءات طوال الوقت، ولكن ليس كثيرًا. فيما يلي مثال لبرنامج يقوم بطباعة رسالة كل ثانية ولا يخرج أبدًا:
public class SleepDemo1 {
public static void main(String[] args) throws InterruptedException {
while (true)
{
Thread.sleep(1000);
System.out.println("One more second");
}
}
}
النقاط المهمة في Java Thread Sleep
من المهم أن تتذكر أن طريقة Java Thread Sleep تعمل بطريقة:-
يقوم دائمًا بتعليق تنفيذ مؤشر الترابط الحالي.
-
ينام الخيط الفعلي حتى يستيقظ، ويعتمد وقت التنفيذ على مؤقتات النظام والمجدولين.
-
خيط النوم لا يمنع الخيط الحالي.
-
يمكن لأي مؤشر ترابط آخر أن يقاطع مؤشر الترابط النائم الحالي، وفي هذه الحالة يتم طرح InterruptedException .
-
لا يمكن أن تكون قيمة الوسيطة للمللي ثانية سالبة، وإلا فسيتم طرح IllegalArgumentException .
public class SleepDemo1 {
public static void main(String[] args) throws InterruptedException {
//the current time in milliseconds
long start = System.currentTimeMillis();
// stop the main thread of the program for 5000 milliseconds (5 seconds)
Thread.sleep(-5000);
System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " ms");
}
}
هنا هو الإخراج:
استثناء في مؤشر الترابط "الرئيسي" java.lang.IllegalArgumentException: قيمة المهلة سالبة في java.base/java.lang.Thread.sleep(Native Method) في SleepDemo.main(SleepDemo.java:7)
أعلاه نضع الخيط الرئيسي للنوم. الآن دعونا نحاول تطبيق الطريقة على موضوع آخر.
// Java Program to sleep the custom thread
public class SleepDemo2 extends Thread{
public void run()
{
// thread 0
try {
for (int i = 0; i < 10; i++) {
// sleeps the main thread for about 2 seconds
Thread.sleep(2000);
System.out.println(i);
}
}
catch (Exception e) {
// catching the exception
System.out.println(e);
}
}
public static void main(String[] args)
{
SleepDemo2 sleepDemo2 = new SleepDemo2();
sleepDemo2.start();
}
}
الإخراج هو:
0 1 2 3 4 5 6 7 8 9
GO TO FULL VERSION