تفاوت بین 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 که بیدار شده است، میتوان بیدار کرد.
در مواردی که میخواهید همه نخهایی که در حالت انتظار هستند، به یکباره بیدار شوند، از ()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 برای همگامسازی چند نخی استفاده کنیم. طبیعی است که موارد زیادی در این خصوص وجود دارند که باید بیان کرد، اما در این مقاله مقدماتی به این حدود اکتفا کردهایم.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای جاوا (Java)
- آموزش کامل جاوا (Java)
- مجموعه آموزشهای برنامهنویسی
- زبان برنامه نویسی جاوا (Java) — از صفر تا صد
- ۱۰ مفهوم اصلی زبان جاوا که هر فرد مبتدی باید بداند
- Thread چیست ؟ — به زبان ساده و جامع
==
سلام و درود
استاد ما از دستور wait و چرخه فور متونیم تایمر بسازیم ?