// Tutorial //

Thread.sleep() in Java - Java Thread sleep

Published on August 3, 2022
Default avatar
By Pankaj
Developer and author at DigitalOcean.
Thread.sleep() in Java - Java Thread sleep

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Thread.sleep in Java

Thread.sleep() method can be used to pause the execution of current thread for specified time in milliseconds. The argument value for milliseconds can’t be negative, else it throws IllegalArgumentException. java thread sleep, Thread.sleep in java There is another overloaded method sleep(long millis, int nanos) that can be used to pause the execution of current thread for specified milliseconds and nanoseconds. The allowed nano second value is between 0 and 999999.

Java Thread Sleep Example

Here is a simple program where Thread.sleep() is used to pause the main thread execution for 2 seconds. ThreadSleep.java

package com.journaldev.threads;

public class ThreadSleep {

    public static void main(String[] args) throws InterruptedException {
        long start = System.currentTimeMillis();
        System.out.println("Sleep time in ms = "+(System.currentTimeMillis()-start));


If you will run the above program, you will notice that the thread sleep time it prints is slightly greater than 2000. This is caused by how thread sleep works and operating system specific implementation of thread scheduler.

Java Thread Sleep important points

  1. It always pause the current thread execution.
  2. The actual time thread sleeps before waking up and start execution depends on system timers and schedulers. For a quiet system, the actual time for sleep is near to the specified sleep time but for a busy system it will be little bit more.
  3. Thread sleep doesn’t lose any monitors or locks current thread has acquired.
  4. Any other thread can interrupt the current thread in sleep, in that case InterruptedException is thrown.

How Thread Sleep Works

Thread.sleep() interacts with the thread scheduler to put the current thread in wait state for specified period of time. Once the wait time is over, thread state is changed to runnable state and wait for the CPU for further execution. So the actual time that current thread sleep depends on the thread scheduler that is part of operating system.

Want to learn more? Join the DigitalOcean Community!

Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest.

Sign up
About the authors
Default avatar


Developer and author at DigitalOcean.

Still looking for an answer?

Was this helpful?

Sir can you please explain this topic { waiting of child thread until completing main thread}

- Pradeep Singh

    what is difference between t1.run() and t1.start()?

    - Shweta

      how the execution of two threads goes when sleep is not there? how does thread scheduler perform in this case…?

      - Swapna

        how do we come to know that, how much time we have to provide to the threads for sleep or wait. If we are working on big projects.

        - Ishant

          Suppose if a thread is kept in sleep and after completing sleep mode time the processor is running another thread. then will the current thread stops and executes thread that completed sleep mode or thread that is in sleep mode executed after current running process is terminated please explain it in detail I am new to java

          - Pavan

            long start = System.currentTimeMillis(); what does this line have in the code?


              Thread One = new Thread( ()-> {}); What is the difference between calling One.sleep() and Thread.sleep();

              - James

                Hi Pankaj, I modified your code like below, and I can see same sleep time after every execution – long sleepTime = 999; System.out.println("Going to sleep for "+sleepTime); long start = 0L; try { start = System.currentTimeMillis(); Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Sleep time in ms = "+(System.currentTimeMillis()-start)); I guess, the difference is coming due to the startTime capture statement execution and the actual sleep statement, if you keep them one after the other, you won’t see the difference anymore. I understand that your explanation is correct too, because all thread execution depends on how OS allow them. Thanks

                - Punit

                  Hi Pankaj, Your blog is very good and more informative. But its very good if you provide link to export to pdf. Thanks Maruthi

                  - maruthi

                    class TestCallRun extends Thread{ public void run(){ for(int i=1;i<5;i++){ try{Thread.sleep(5000);}catch(InterruptedException e){System.out.println(e);} System.out.println(i); } } public static void main(String args[]){ TestCallRun2 t1=new TestCallRun2(); TestCallRun2 t2=new TestCallRun2(); t1.start(); t2.run(); } } why the output of above program is same as when we call t1.start(); t2.start(). 1 1 2 2 3 3 4 4 but output is different when we call t1.run();t2.run(); 1 2 3 4 1 2 3 4 according to my understating output of t1.start(); t2.run() should be 1 --t1 thread 1 --t2 thread 2 --t2 thread 3 --t2 thread 4 --t2 thread 2 --t1 thread 3 --t1 thread 4 --t1 thread

                    - Nitin