Saturday, December 31, 2011

Difference between Wait and Sleep , Yield in Java

Difference between wait and sleep or difference between Sleep and yield in Java are popular core Java interview questions and asked on multi-threading interviews. Out of three Sleep () and Yield () methods are defined in thread class while wait() is defined in Object class, which is another interview question. In this Java tutorial we will learn what is sleep in Java, important points of sleep in java and difference between Wait and sleep in Java.

Wait vs Sleep vs Yield in Java

Difference between Wait and Sleep in Java

difference between sleep, wait and yield in Java exampleMain difference between wait and sleep is that wait() method release the acquired monitor when thread is waiting while Thread.sleep() method keeps the lock or monitor even if thread is waiting. Also wait method in java should be called from synchronized method or block while there is no such requirement for sleep() method. Another difference is Thread.sleep() method is a static method and applies on current thread, while wait() is an instance specific method and only got wake up if some other thread calls notify method on same object. also in case of sleep, sleeping thread immediately goes to Runnable state after waking up while in case of wait, waiting thread first acquires the lock and then goes into Runnable state. So based upon your need if you require a specified second of pause use sleep() method or if you want to implement inter-thread communication use wait method.


here is list of difference between wait and sleep in Java :

1) wait is called from synchronized context only while sleep can be called without synchronized block. see Why wait and notify needs to call from synchronized method for more detail.

2) wait is called on Object while sleep is called on Thread. see Why wait and notify are defined in object class instead of Thread.

3) waiting thread can be awake by calling notify and notifyAll while sleeping thread can not be awaken by calling notify method.

4) wait is normally done on condition, Thread wait until a condition is true while sleep is just to put your thread on sleep.

5) wait release lock on object while waiting while sleep doesn’t release lock while waiting.

Difference between yield and sleep in java

Major difference between yield and sleep in Java is that yield() method pauses the currently executing thread temporarily for giving a chance to the remaining waiting threads of the same priority to execute. If there is no waiting thread or all the waiting threads have a lower priority then the same thread will continue its execution. The yielded thread when it will get the chance for execution is decided by the thread scheduler whose behavior is vendor dependent. Yield method doesn’t guarantee  that current thread will pause or stop but it guarantee that CPU will be relinquish by current Thread as a result of call to Thread.yield() method in java.

Sleep method in Java has two variants one which takes millisecond as sleeping time while other which takes both mill and nano second for sleeping duration.

sleep(long millis)
or
sleep(long millis,int nanos)

Cause the currently executing thread to sleep for the specified number of milliseconds plus the specified number of nanoseconds.

Example of Thread Sleep method in Java

Here is sample code example of Sleep Thread in Java. In this example we have put Main thread in Sleep for 1 second.

/*
 * Example of Thread Sleep method in Java
 */
public class SleepTest {
      
       public static void main(String... args){
              System.out.println(Thread.currentThread().getName() + " is going to sleep for 1 Second");
              try {
                     Thread.currentThread().sleep(1000);
              } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              }
              System.out.println("Main Thread is woken now");
       }

}

Output:
main is going to sleep for 1 Second
Main Thread is woken now



10 points about Thread sleep() method in Java

I have listed down some important and worth to remember points about Sleep() method of Thread Class in Java:

1) Thread.sleep() method is used to pause the execution, relinquish the CPU and return it to thread scheduler.

2) Thread.sleep() method is a static method and always puts current thread on sleep.

3) Java has two variants of sleep method in Thread class one with one argument which takes milliseconds as duration for sleep and other method with two arguments one is millisecond and other is nanosecond.

4) Unlike wait() method in Java, sleep() method of Thread class doesn't relinquish the lock it has acquired.

5) sleep() method throws Interrupted Exception if another thread interrupt a sleeping thread in java.

6) With sleep() in Java its not guaranteed that when sleeping thread woke up it will definitely get CPU, instead it will go to Runnable state and fight for CPU with other thread.

7) There is a misconception about sleep method in Java that calling t.sleep() will put Thread "t" into sleeping state, that's not true because Thread.sleep method is a static method it always put current thread into Sleeping state and not thread "t".

That’s all on Sleep method in Java. We have seen difference between sleep and wait along with sleep and yield in Java. In Summary just keep in mind that both sleep() and yield() operate on current thread.

Java Tutorial you may like:

7 comments :

Java Tutorial said...

Moreover, developers can look at the java source for these methods to get more insight into java multithreading tutorial

Anonymous said...

Thread.currentThread().sleep(1000);

should be written as

Thread.sleep(1000);

since sleep is a static method

Javin @ Semaphore Example Java said...

Hi @Anonymous, yes it Thread.sleep() is absolutely Ok and static method should be called like that but I still like Thread.currentThread().sleep() because its much clearer on saying that current thread is going to sleep.

Bhuneswar said...

Don't rely on Thread.yield method, in one JVM yield method may produce desired result but may not work on other JVM. Instead of using yield method use Thread.sleep(1) but don't use Thread.sleep(0) which will return immediately.

Anonymous said...

What is the state of Thread, when we call sleep(), wait() or yeild() methods? This questions was asked to me on JP Morgan Interview.

Pushkar said...

A thread can be in WAITING or TIMED_WAITING state, due to a call to wait() or sleep() method. If you call wait and sleep without timeout then Thread will be in WAITING (ThreadState.WAITING) state, while a call to sleep() and wait() without timeout will leave thread in TIMED_WAITING state. Difference between WAITING and TIMED_WAITING state is timeout, which means thread will come out once timeout is expired.

Anonymous said...

i got confused in wait and sleep..please clarify more..

Post a Comment