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)
结尾
本文到这里就结束了,感谢看到最后的朋友,都看到最后了,点个赞再走啊,如有不对之处还请多多指正。