در برنامههای جاوا، موقعیتهایی پیش میآید که یک رشته خیلی سریع اجرا میشود یا برنامه باید به رشته دیگری سوئیچ کند. برای انجام این کار، باید اجرای thread فعلی را به حالت تعلیق در آورید. در جاوا، این کار را می توان با استفاده از متد ()java.lang.Thread.sleep انجام داد .
متد Thread.sleep().
کلاس Thread در بسته Java.lang وجود دارد و حاوی متد ()Thread.sleep است . روش Java.lang.thread sleep() برای تعلیق thread فعلی برای مدت زمان مشخصی بر حسب میلی ثانیه استفاده می شود. اگر به اسناد Oracle نگاه کنید ، متوجه میشوید که دو متد sleep() از کلاس Thread وجود دارد .
static void sleep(long millis)
که در آن میلیز زمان بر حسب میلی ثانیه است. این روش بسته به دقت زمانسنجها و زمانبندیهای سیستم، باعث میشود تا رشته در حال اجرا به مدت میلیثانیه به حالت خوابیده (به طور موقت اجرا را متوقف کند، "خواب"). مقدار آرگومان برای میلی ثانیه نمی تواند منفی باشد. در این صورت، IllegalArgumentException پرتاب خواهد شد.
static void sleep(long millis, int nanos)
جایی که زمان را بر حسب میلیثانیه میسنجید و نانو، زمان بر حسب نانوثانیه است. این نوع روش برای تعلیق اجرای thread فعلی برای زمان دقیق بر حسب میلی ثانیه و نانوثانیه استفاده می شود. مقدار نانوثانیه بین 0 و 999999 معتبر است. بیایید یک برنامه ساده ایجاد کنیم که از متد Thread.sleep() برای توقف اجرای thread اصلی به مدت 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 ثانیه متوقف نشد، بلکه کمی بیشتر شد. همچنین اگر برنامه را بر روی رایانه خود اجرا کنید، متوجه خواهید شد که می تواند اجرای thread را برای بیش از 5000 میلی ثانیه متوقف کند و برای 5008 میلی ثانیه لازم نیست. نکته این است که همه چیز به سیستم عامل و اجرای خاص زمانبند نخ بستگی دارد. با کمی جزئیات بیشتر، زمان واقعی انتظار یک رشته قبل از بیدار شدن و شروع اجرا به تایمرها و زمانبندی های سیستم بستگی دارد. برای یک سیستم بی صدا، زمان واقعی خواب نزدیک به زمان خواب مشخص شده است، اما برای یک سیستم بارگذاری شده کمی بیشتر خواهد بود. این روش اغلب در موضوعات کودک استفاده می شود، زمانی که شما نیاز به انجام کارهایی دائمی دارید، اما نه خیلی مکرر. در اینجا نمونه ای از برنامه ای است که هر ثانیه یک پیام چاپ می کند و هرگز خارج نمی شود:
public class SleepDemo1 {
public static void main(String[] args) throws InterruptedException {
while (true)
{
Thread.sleep(1000);
System.out.println("One more second");
}
}
}
نکات مهم جاوا Thread Sleep
مهم است که به یاد داشته باشید که روش جاوا Thread Sleep به گونه ای عمل می کند که:-
همیشه اجرای thread فعلی را به حالت تعلیق در می آورد.
-
رشته واقعی تا زمانی که بیدار شود میخوابد و زمان اجرا به تایمرها و زمانبندیهای سیستم بستگی دارد.
-
نخ خواب، نخ فعلی را مسدود نمی کند.
-
هر رشته دیگری می تواند رشته خواب فعلی را قطع کند، در این صورت یک 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");
}
}
در اینجا خروجی است:
استثنا در thread "main" java.lang.IllegalArgumentException: مقدار timeout در java.base/java.lang.Thread.sleep (روش بومی) در 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