تفاوت بین Wait و Sleep در جاوا — راهنمای جامع

۲۴۶ بازدید
آخرین به‌روزرسانی: ۰۵ شهریور ۱۴۰۲
زمان مطالعه: ۲ دقیقه
تفاوت بین Wait و Sleep در جاوا — راهنمای جامع

در این مقاله به بررسی متدهای استاندارد ()wait و ()sleep در هسته جاوا می‌پردازیم و تفاوت بین Wait و Sleep و شباهتشان را در این زبان برنامه‌نویسی بررسی می‌کنیم. این دو متد در خصوص Thread در جاوا کاربرد دارند.

تفاوت‌های عمومی بین Wait و Sleep

به بیان ساده ()wait یک متد وهله‌ای است که برای همگام‌سازی نخ (Thread) مورد استفاده قرار می‌گیرد. این متد را می‌توان از هر شیئی فراخوانی کرد، زیرا درست در java.lang.Object تعریف شده است، اما امکان فراخوانی آن تنها از یک بلوک همگام وجود دارد. این متد قفل روی شیء را آزاد می‌کند به طوری که نخ دیگر بتواند وارد شده و قفل آن را به دست آورد.

از سوی دیگر ()Thread.sleep یک متد استاتیک است که می‌تواند از هر context فراخوانی شود. متد ()Thread.sleep نخ کنونی را تعلیق می‌کند و هیچ قفلی را آزاد نمی‌کند. در ادامه یک نگاه اولیه بسیار ساده به این API هسته مرکزی جاوا داریم:

1private static Object LOCK = new Object();
2 
3private static void sleepWaitExamples() 
4  throws InterruptedException {
5  
6    Thread.sleep(1000);
7    System.out.println(
8      "Thread '" + Thread.currentThread().getName() +
9      "' is woken after sleeping for 1 second");
10  
11    synchronized (LOCK) {
12        LOCK.wait(1000);
13        System.out.println("Object '" + LOCK + "' is woken after" +
14          " waiting for 1 second");
15    }
16}

با اجرای مثال فوق خروجی زیر ایجاد می‌شود:

Thread ‘main' is woken after sleeping for 1 second

Object ‘java.lang.Object@31befd9f' is woken after waiting for 1 second

بیدار کردن Wait و Sleep

زمانی که از متد ()sleep استفاده می‌کنیم، نخ مربوطه پس از سپری شدن زمان مشخص‌شده آغاز می‌شود، مگر این که interrupt شده باشد. در مورد ()wait فرایند بیدار شدن کمی پیچیده‌تر است. نخ را از طریق فراخوانی متدهای ()notify یا ()notifyAll روی monitor که بیدار شده است، می‌توان بیدار کرد.

تفاوت بین Wait و Sleep

در مواردی که می‌خواهید همه نخ‌هایی که در حالت انتظار هستند، به یک‌باره بیدار شوند، از ()notifyAll به جای ()notify استفاده کنید. مشابه خود متد ()wait، متدهای ()notify و ()notifyAll نیز باید از یک کانتکست همگام‌سازی شده فراخوانی شوند. طرز کار به صورت زیر است:

1synchronized (b) {
2    while (b.sum == 0) {
3        System.out.println("Waiting for ThreadB to complete...");
4        b.wait();
5    }
6 
7    System.out.println("ThreadB has completed. " + 
8      "Sum from that thread is: " + b.sum);
9}

همچنین روش بیدار کردن یک نخ منتظر با فراخوانی ()notify روی monitor به صورت زیر است:

1int sum;
2  
3@Override
4public void run() {
5    synchronized (this) {
6        int i = 0;
7        while (i < 100000) {
8            sum += i;
9            i++; 
10        }
11        notify(); 
12    } 
13}

با اجرای کد فوق خروجی زیر تولید می‌شود:

Waiting for ThreadB to complete…

ThreadB has completed. Sum from that thread is: 704982704

سخن پایانی

در این مقاله کوتاه به بررسی معنای wait و sleep در جاوا پرداختیم. به طوری کلی باید از ()sleep برای کنترل کردن زمان اجرای یک نخ و از ()wait برای همگام‌سازی چند نخی استفاده کنیم. طبیعی است که موارد زیادی در این خصوص وجود دارند که‌ باید بیان کرد، اما در این مقاله مقدماتی به این حدود اکتفا کرده‌ایم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
baeldung
۱ دیدگاه برای «تفاوت بین Wait و Sleep در جاوا — راهنمای جامع»

سلام و درود
استاد ما از دستور wait و چرخه فور متونیم تایمر بسازیم ?

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *