The Java Thread.sleep()
method can be used to pause the execution of the current thread for a specified time in milliseconds. The argument value for milliseconds cannot be negative. Otherwise, it throws IllegalArgumentException
.
sleep(long millis, int nanos)
is another method that can be used to pause the execution of the current thread for a specified number of milliseconds and nanoseconds. The allowed nanosecond values are between 0
and 999999
.
In this article, you will learn about Java’s Thread.sleep()
.
Thread.sleep()
interacts with the thread scheduler to put the current thread in a wait state for a specified period of time. Once the wait time is over, the thread state is changed to a runnable state and waits for the CPU for further execution. The actual time that the current thread sleeps depends on the thread scheduler that is part of the operating system.
Thread.sleep()
doesn’t lose any monitors or lock the current thread it has acquired.InterruptedException
is thrown.Here is an example program where Thread.sleep()
is used to pause the main thread execution for 2 seconds (2000 milliseconds):
package com.journaldev.threads;
public class ThreadSleep {
public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
Thread.sleep(2000);
System.out.println("Sleep time in ms = " + (System.currentTimeMillis() - start));
}
}
First, this code stores the current system time in milliseconds. Then it sleeps for 2000 milliseconds. Finally, this code prints out the new current system time minus the previous current system time:
OutputSleep time in ms = 2005
Notice that this difference is not precisely 2000 milliseconds. This is due to how Thread.sleep()
works and the operating system-specific implementation of the thread scheduler.
In this article, you learned about Java’s Thread.sleep()
.
Continue your learning with more Java tutorials.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
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?
- FREDY ORLANDO MARCELO CASTIBLANCO
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