Sleep方法介绍
sleep方法是Thread类中的一个静态方法,当一个执行中的线程调用了Thread的sleep方法之后,调用线程会暂时让出指定时间的执行权,这期间不参与CPU的调度,但是该线程所拥有的监视器资源,比如锁还是持有且不让出的。指定的睡眠时间到了之后,sleep函数会正常返回,线程就处于就绪状态,然后参与CPU调度,获取到CPU的资源后就可以运行了。
线程睡眠时不释放拥有的监视器资源
import java
.util
.concurrent
.locks
.Lock
;
import java
.util
.concurrent
.locks
.ReentrantLock
;
public class SleepTest {
private static final Lock lock
= new ReentrantLock();
public static void main(String
[] args
) {
Thread threadA
= new Thread(new Runnable() {
@Override
public void run() {
lock
.lock();
try {
System
.out
.println("threadA is in sleep");
Thread
.sleep(1000);
System
.out
.println("threadA is in awaked");
}
catch (InterruptedException e
) {
e
.printStackTrace();
}
finally {
lock
.unlock();
}
}
});
Thread threadB
= new Thread(new Runnable() {
@Override
public void run() {
lock
.lock();
try {
System
.out
.println("threadB is in sleep");
Thread
.sleep(1000);
System
.out
.println("threadB is in awaked");
}
catch (InterruptedException e
) {
e
.printStackTrace();
}
finally {
lock
.unlock();
}
}
});
threadA
.start();
threadB
.start();
}
}
输出结果:
threadA is in sleep threadA is in awaked threadB is in sleep threadB is in awaked
看输出结果可以得出,threadA 休眠期间没有释放监视器锁,因此,threadB无法获取到该监视器锁。
休眠线程被中断之后会抛出异常
public class SleepInterrupt {
public static void main(String
[] args
) throws InterruptedException
{
Thread threadA
= new Thread(new Runnable() {
@Override
public void run() {
try {
System
.out
.println("threadA is in sleep");
Thread
.sleep(10000);
System
.out
.println("threadA is in awaked");
}
catch (InterruptedException e
) {
e
.printStackTrace();
}
}
});
threadA
.start();
Thread
.sleep(2000);
threadA
.interrupt();
}
}
输出结果:
threadA is in sleep java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.tim.base.easystart.thread.base.SleepInterrupt$1.run(SleepInterrupt.java:11) at java.lang.Thread.run(Thread.java:748)